[C++,QT/Qml]24.Qml프로그래밍 qml 에서 Enum값 사용하기
프로그래머가 가져야할 필수 역량중에 하나라고 포스팅을 했었는데요
c++에서는 Enum값을 사용해서 프로그래밍을 하는데 qml에서 Enum값을 사용하지 못하면 추후에 디버깅할때 어려움이
따르겠죠?
그래서 오늘은 qml에서 Enum값을 사용하는 방법에 대해서 포스팅 하려고 합니다.
아래의 코드를 보겠습니다.
ConnectEvent.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#ifndef CONNECTEVENT_H
#define CONNECTEVENT_
#include <QQuickView>
#include <QObject>
#include <iostream>
using namespace std;
struct TestStruct{
QString title = "";
QString ButtonText = "";
QString Infomation = "";
};
class ConnectEvent : public QObject//connection을 사용하기 위해 상속 받아야 하는 클래스
{
public:
Q_OBJECT
Q_ENUMS(WEEK)
public:
ConnectEvent();
~ConnectEvent();
void setWindow(QQuickWindow* Window);
void setTestList();
Q_INVOKABLE int getListSize();
Q_INVOKABLE QString getListTitle(int index);
Q_INVOKABLE QString getListButtonText(int index);
Q_INVOKABLE QString getListInfomation(int index);
Q_INVOKABLE void deleteListItem(int index);
private:
QQuickWindow* mMainView;
vector<TestStruct> mTestList;
public:// enum 클래스를 사용하기 위해 등록
enum WEEK{
SUNDAY = 0,//0은 써도되고 안써도 된다.
MONDAY,//밑에있는 수들은 첫번째 설정한 값에서 1씩 추가되어 설정된다.즉 MONDAY는 1이된다.
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
};
Q_DECLARE_METATYPE(ConnectEvent::WEEK)
#endif // CONNECTEVENT_H
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
ConnectEvent.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#include "ConnectEvent.h"
ConnectEvent::ConnectEvent()
{
cout << "ConnectEvent" << endl;
setTestList();//생성자에서 호출해서 객체가 만들어 지자마자 데이터를 vector에 담는다.
qmlRegisterType<ConnectEvent>("ConnectEvent", 1, 0, "ConnectEvent");//class를 qml에서 사용하기 위해서 등록해주는 부분
}
ConnectEvent::~ConnectEvent()
{
}
void ConnectEvent::setWindow(QQuickWindow* Window)
{
mMainView = Window;//connection을 해주기 위해 윈도우를 등록
}
void ConnectEvent::setTestList()
{
std::cout << "setTestList called "<<std::endl;
TestStruct testStruct;
testStruct.title = "Sunday is enum = 0";
testStruct.ButtonText = "Sunday" ;
testStruct.Infomation = "Sunday is hollyday";
mTestList.push_back(testStruct);
testStruct.title = "Monday is enum = 1";
testStruct.ButtonText = "Monday" ;
testStruct.Infomation = "Monday is Work day";
mTestList.push_back(testStruct);
testStruct.title = "Tuesday is enum = 2";
testStruct.ButtonText = "Tuesday" ;
testStruct.Infomation = "Tuesday is Work day";
mTestList.push_back(testStruct);
testStruct.title = "wednesday is enum = 3";
testStruct.ButtonText = "wednesday" ;
testStruct.Infomation = "wednesday is Work day";
mTestList.push_back(testStruct);
testStruct.title = "Thursday is enum = 4";
testStruct.ButtonText = "Thursday" ;
testStruct.Infomation = "Thursday is Work day";
mTestList.push_back(testStruct);
testStruct.title = "Friday is enum = 5";
testStruct.ButtonText = "Friday" ;
testStruct.Infomation = "Friday is Work day";
mTestList.push_back(testStruct);
testStruct.title = "Saturday is enum = 6";
testStruct.ButtonText = "Saturday" ;
testStruct.Infomation = "Saturday is hollyday";
mTestList.push_back(testStruct);
}
int ConnectEvent::getListSize()//리스트의 크기를 가져오기 위함 함수
{
return mTestList.size();
}
QString ConnectEvent::getListTitle(int index)//리스트 인덱스의 제목을 가져오기 위한 함수
{
return mTestList.at(index).title;
}
QString ConnectEvent::getListButtonText(int index)//리스트 인덱스의 버튼 텍스트를 가져오기 위한 함수
{
return mTestList.at(index).ButtonText;
}
QString ConnectEvent::getListInfomation(int index)//리스트 인덱스의 내부 정보를 가져오기 위한 함수
{
return mTestList.at(index).Infomation;
}
void ConnectEvent::deleteListItem(int index)//c++ 리스트의 데이터를 삭제
{
int count = 0;
std::cout << "deleteListItem index:" << index << std::endl;
std::cout << "deleteListItem ListInfomation:" << getListInfomation(index).toStdString() << std::endl;
for(std::vector<TestStruct>::iterator it = mTestList.begin(); it != mTestList.end(); it++){
if(count == index){
std::cout << "delete count:" << count<<std::endl;
it = mTestList.erase(it);
break;
}else{
count++;
}
}
std::cout << "mTestList.size:" << mTestList.size()<<std::endl;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
main.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
import QtQuick 2.9
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
import ConnectEvent 1.0//등록한 클래스 타입을 import해준다.
import "."
Window {
id:mainWindow
property bool mbImageClicked : true
property int mCount : 0
property int mListClickIndex : 0//클릭한 리스트의 index를 담는 전역 변수
signal qmlSignalListUpdate();//리스트가 업데이트되었다는 것을 알려주기 위한 시그널 등록
visible: true
width: 800
height: 600
title: qsTr("Hello World")
ConnectEvent//클래스를 qml 타입으로 지정
{
id:connectEvent
}
Component.onCompleted://view가 처음 실행될때 제일 처음으로 불려지는곳
{
//조금 예쁘게 보이기 위해서 리스트를 많이 추가함 리스트가 너무 적을시 이미지 해상도가 작아서 이미지가 바둑판식으로 나옴
for(var i = 0; i < connectEvent.getListSize(); i++){//리스트의 개수만큼 for문을 돌린다.
listView.model.append({"list_text": connectEvent.getListTitle(i),//모델에 리스트의 데이터값을 넣어준다.
"list_button_text": connectEvent.getListButtonText(i)})//listview에 선언한 임의의 모델 안에 데이터를 넣어준다.
}
console.log("enum value log:" + ConnectEvent.SUNDAY)//qml에서 enum값 로그 찍는 방법
}
onQmlSignalListUpdate:{//시그널이 호출되면 실행하는 함수
console.log("onQmlSignalListUpdate called")
listView.model.clear();//리스트 초기화
for(var i = 0; i < connectEvent.getListSize(); i++){//리스트 초기화 후 다시 넣어줌
listView.model.append({"list_text": connectEvent.getListTitle(i),
"list_button_text": connectEvent.getListButtonText(i)})
}
}
Component {//리스트 뷰의 틀을 만든다.
id: contactDelegate
Item {
width: 800
height: 100
Text//리스트에 텍스트를 넣어주기 위해 텍스트 객체를 만들어준다.
{
id:listView_Text
anchors.left: parent.left
anchors.leftMargin: 50
anchors.verticalCenter: parent.verticalCenter
text:list_text//모델에 매칭이될 변수 listview에 원하는 값을 넣기위해서 설정하는 값
}
Rectangle//리스트의 구분선
{
id:line
width:parent.width
anchors.bottom:parent.bottom//현재 객체의 아래 기준점을 부모객체의 아래로 잡아주어서 위치가 아래로가게 설정
height:1
color:"black"
}
MouseArea
{
id:listMouseArea
anchors.fill: parent
onClicked:
{
mListClickIndex = index;//여기에서 사용하는 index는 클릭했을때의 index를 리턴해준다
//그래서 현재 선택한 리스트를 전역변수에 담고 다음 화면에서 그에 해당하는 정보를 보여준다.
if(index == ConnectEvent.SUNDAY || index == ConnectEvent.SATURDAY){//qml에서 enum값을 이용해서 if문 사용하는 방법 //일요일 이거나 토요일이면 정보 화면으로 이동
stackView.push(Qt.resolvedUrl("qrc:/listInfo.qml"))
}else{//이외에는 삭제화면으로 이동
stackView.push(Qt.resolvedUrl("qrc:/deleteList.qml"))
}
}
}
//버튼 객체를 mouseArea아래로 옮겼다 이유는 mouseArea가 부모의 영역을 포함하고 있는데
//버튼 영역도 부모의 영역 안에 있기 때문에 버튼클릭시 버튼클릭이 아닌 리스트의 클릭이 되어 버린다.
Button//리스트에 버튼을 넣어주기 위해 버튼 객체를 만들어준다.
{
id:listView_Button
width:120
height:40
anchors.rightMargin: 30
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
text: list_button_text//모델에 매칭이될 변수 listview에 원하는 값을 넣기위해서 설정하는 값
onClicked:
{
connectEvent.deleteListItem(index);//c++ 리스트의 데이터를 삭제
listView.model.remove(index);//리스트의 모델에 삭제하는 함수(실시간 삭제)
}
}
}
}
StackView{
id:stackView
anchors.fill: parent
initialItem: Item //제일 첫화면을 설정하는 것으로 설정을 안하면 되돌아오기가 안된다.
{
ListView {
id:listView
anchors.fill: parent
model: ListModel{}//임으로 만들 모델을 넣어준다.
delegate: contactDelegate//delegate란 리스트 한개의 틀(틀을 하나 만들어서 그것들을 여러개 붙여놓은것이 리스트 뷰이다.)
highlight: Rectangle { color: "lightsteelblue"; radius: 5 }
focus: true
}
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
listInfo.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import QtQuick 2.0
import QtQuick.Controls 2.0
import ConnectEvent 1.0
Item {
width: 800
height: 600
ConnectEvent//클래스를 qml 타입으로 지정
{
id:connectEvent
}
Component.onCompleted: {
testText.text = connectEvent.getListInfomation(mListClickIndex);
}
Component.onDestruction: {
}
Rectangle//배경 색을 지정하는 부분
{
anchors.fill: parent
color:"green"
}
Text
{
id:testText
anchors.centerIn: parent
text:"screen1!!"
font.pixelSize: 50
font.bold: true
}
Button
{
id:previousButton
anchors.top:testText.bottom
anchors.horizontalCenter: parent.horizontalCenter
text:"go previous screen"
onClicked: {
console.log("pop screen1")
stackView.pop();//이전화면을 호출하기위해 stack의 제일 위에 화면을 밖으로 빼주어 첫화면을 보여준다.
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
deleteList.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
import ConnectEvent 1.0//등록한 클래스 타입을 import해준다.
Item {
width: 800
height: 600
Component.onCompleted://view가 처음 실행될때 제일 처음으로 불려지는곳
{
console.log("connectEvent.getListSize():" + connectEvent.getListSize())
for(var i = 0; i < connectEvent.getListSize(); i++){//리스트의 개수만큼 for문을 돌린다.
listView.model.append({"list_text": connectEvent.getListTitle(i),//모델에 리스트의 데이터값을 넣어준다.
"list_button_text": connectEvent.getListButtonText(i),
"checkValue": false})//listview에 선언한 임의의 모델 안에 데이터를 넣어준다.
}
}
Component {//리스트 뷰의 틀을 만든다.
id: contactDelegate
Item {
width: 800
height: 100
CheckBox
{
id:checkbox
anchors.left: parent.left
anchors.leftMargin: 30
anchors.verticalCenter: parent.verticalCenter
checked: checkValue
}
Text//리스트에 텍스트를 넣어주기 위해 텍스트 객체를 만들어준다.
{
id:listView_Text
anchors.left: parent.left
anchors.leftMargin: 100
anchors.verticalCenter: parent.verticalCenter
text:list_text//모델에 매칭이될 변수 listview에 원하는 값을 넣기위해서 설정하는 값
}
Rectangle//리스트의 구분선
{
id:line
width:parent.width
anchors.bottom:parent.bottom//현재 객체의 아래 기준점을 부모객체의 아래로 잡아주어서 위치가 아래로가게 설정
height:1
color:"black"
}
MouseArea
{
id:listMouseArea
anchors.fill: parent
onClicked:
{
if(listView.model.get(index).checkValue){
listView.model.get(index).checkValue = false
}else
listView.model.get(index).checkValue = true
}
}
}
}
ListView {
id:listView
width:parent.width
height:parent.height - 100//리스트 뷰 밑에 버튼을 만들기위해 리스트뷰의 크기를 설정하는 것
clip:true//true 하면 리스트의 높이 보다 커도 리스트가 보여지는 것처럼 됨
//false 하면 리스트의 높이만 큼만 deletegate가 보여짐
model: ListModel{}//임으로 만들 모델을 넣어준다.
delegate: contactDelegate//delegate란 리스트 한개의 틀(틀을 하나 만들어서 그것들을 여러개 붙여놓은것이 리스트 뷰이다.)
highlight: Rectangle { color: "lightsteelblue"; radius: 5 }
focus: true
}
Button
{
id:deleteButton
width:200
height:50;
anchors.top: listView.bottom
anchors.topMargin: 30
anchors.horizontalCenter:parent.horizontalCenter
text:"delete"
onClicked: {
for(var i = listView.count - 1; i >= 0; i--){
if(listView.model.get(i).checkValue){
connectEvent.deleteListItem(i);
listView.model.remove(i);
}
}
mainWindow.qmlSignalListUpdate();//삭제 완료후 리스트가 업데이트 되었다는 것을 알려주기 위해 시그널을 호출 해준
}
}
Button
{
id:allSelectButton
width:200
height:50;
anchors.top: listView.bottom
anchors.topMargin: 30
anchors.left: deleteButton.right
anchors.leftMargin: 20
text:"all Select"
onClicked: {
for(var i = 0; i < listView.count; i++){
if(!listView.model.get(i).checkValue){
listView.model.get(i).checkValue = true
}
}
}
}
Button
{
id:backbutton
width:200
height:50;
anchors.top: listView.bottom
anchors.topMargin: 30
anchors.right: deleteButton.left
anchors.rightMargin: 20
text:"back"
onClicked: {
stackView.pop();
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
qml 에서 enum값을 사용하기 위해서 c++ 소스코드 헤더파일에 enum값을 넣어줍니다.
1
2
3
4
5
6
7
8
9
10
|
public:// enum 클래스를 사용하기 위해 등록
enum WEEK{
SUNDAY = 0,//0은 써도되고 안써도 된다.
MONDAY,//밑에있는 수들은 첫번째 설정한 값에서 1씩 추가되어 설정된다.즉 MONDAY는 1이된다.
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
현재 클래스에서 사용하는 enum값을 사용하기 위해서 ConnectEvent 클래스 안에 enum값을 선언해 주었습니다.
그리고 메인 qml에서 ConnectEvent 클래스의 enum값을 사용하기위해서 아래와 같이 import시켜 줍니다.
1
|
import ConnectEvent 1.0//등록한 클래스 타입을 import해준다.
|
아래와 같이 Invoke함수들을 사용하기위해서 클래스를 등록하는 것은 따로 안해주어도 enum값을 사용하는데 무리가
없습니다. 그러나 Invoke함수들을 사용하기 위해서 아래와 같이 등록 해주었습니다.
1
2
3
4
|
ConnectEvent//ConnectEvent 클래시의 enum값을 사용할때는 따로 선언 안해주어도 된다.
{
id:connectEvent
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
Invoke함수를 사용하는 방법은 아래 url에 포스팅하여 설명드렸었습니다. 참고하시면 될것 같습니다.
https://youonlyliveonce1.tistory.com/26?category=712090
그리고 enum값이 잘 출력이 되고 enum값을 사용하기 위해서 로그로 아래와 같이 출력해 주었습니다.
1
|
console.log("enum value log:" + ConnectEvent.SUNDAY)//qml에서 enum값 로그 찍는 방법
|
여기서 보시면 ConnectEvent.SUNDAY 와 같이 enum값을 사용하는 방법 입니다.
그리고 각 리스트에서 일요일과 토요일이 아니면 삭제화면으로 가도록 아래와 같이 구현했습니다.
각 index들은 enum값들을 사용하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
MouseArea
{
id:listMouseArea
anchors.fill: parent
onClicked:
{
mListClickIndex = index;//여기에서 사용하는 index는 클릭했을때의 index를 리턴해준다
//그래서 현재 선택한 리스트를 전역변수에 담고 다음 화면에서 그에 해당하는 정보를 보여준다.
if(index == ConnectEvent.SUNDAY || index == ConnectEvent.SATURDAY){//qml에서 enum값을 이용해서 if문 사용하는 방법 //일요일 이거나 토요일이면 정보 화면으로 이동
stackView.push(Qt.resolvedUrl("qrc:/listInfo.qml"))
}else{//이외에는 삭제화면으로 이동
stackView.push(Qt.resolvedUrl("qrc:/deleteList.qml"))
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
여기 까지 qml에서 enum값을 사용하는 기본 방법에 대해서 설명 드렸는데요 만약에 여기서 enum값이 수백개가
되어서 enum값을 계속 추가하게 되면 class안에 enum값을 계속 추가해야할지 의문이 드는데요
이럴때는 enum값 들을 따로 파일로 빼서 모아 둘수가 있습니다.
enum값 들을 따로 모아서 한꺼번에 선언하면 코드를 아주 깔끔히 정리할수 있기 때문에 모아서 선언하는 것을 더 추천
드립니다.
모아서 선언하는 방법은 아래아 같이 선언해 주시면 됩니다.
Connect.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#ifndef CONNECTEVENT_H
#define CONNECTEVENT_
#include <QQuickView>
#include <QObject>
#include <iostream>
using namespace std;
struct TestStruct{
QString title = "";
QString ButtonText = "";
QString Infomation = "";
};
class ConnectEvent : public QObject//connection을 사용하기 위해 상속 받아야 하는 클래스
{
public:
Q_OBJECT
Q_ENUMS(WEEK)
public:
ConnectEvent();
~ConnectEvent();
void setWindow(QQuickWindow* Window);
void setTestList();
Q_INVOKABLE int getListSize();
Q_INVOKABLE QString getListTitle(int index);
Q_INVOKABLE QString getListButtonText(int index);
Q_INVOKABLE QString getListInfomation(int index);
Q_INVOKABLE void deleteListItem(int index);
private:
QQuickWindow* mMainView;
vector<TestStruct> mTestList;
public:// enum 클래스를 사용하기 위해 등록
#include <AllEnum.hpp>//enum값 들을 등록하기 위한 헤더파일
};
Q_DECLARE_METATYPE(ConnectEvent::WEEK)
#endif // CONNECTEVENT_H
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
AllEnum.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#ifndef ALLENUM_HPP
#define ALLENUM_HPP
enum WEEK{
SUNDAY = 0,//0은 써도되고 안써도 된다.
MONDAY,//밑에있는 수들은 첫번째 설정한 값에서 1씩 추가되어 설정된다.즉 MONDAY는 1이된다.
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
#endif // ALLENUM_HPP
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 이미지처럼 AllEnum 헤더파일을 만들어 줍니다. 그리고 ConnectEvent class 에서 아래와 같이 선언을 해주면
1
2
3
|
public:// enum 클래스를 사용하기 위해 등록
#include <AllEnum.hpp>//enum값 들을 등록하기 위한 헤더파일
};
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
Enum값들을 등록시키고 싶을때마다 AllEnum헤더파일에 Enum값들을 선언해서 코드를 깔끔하게 짤수가 있습니다.
여기 까지 qml에서 enum값을 사용하는 방법에 대해서 포스팅을 하였습니다.
C++로 구현하시는 모든 분들이 꼭Enum값을 사용해 주셨으면 좋겠고 qml에서도 꼭 Enum값을 사용해 주어서
디버깅하기 좋은 코드로 구현해 주셨으면 좋겠습니다.
여기까지 읽어 주셔서 감사합니다.
'QT and QML' 카테고리의 다른 글
[C++,QT/Qml]26.Qml프로그래밍 버튼이 있는 팝업 출력하기 1(팝업 영역이 아닌 부분을 클릭시 팝업 닫기) (0) | 2019.10.13 |
---|---|
[C++,QT/Qml]25.Qml프로그래밍 cpp qml 연동4(C++ 에서 qml 함수 호출하기 두번째 방법) (0) | 2019.10.13 |
[C++,QT/Qml]23.Qml프로그래밍 리스트 스크롤바 만들기2(custom scrollbar 만들기) (0) | 2019.09.22 |
[C++,QT/Qml]22.Qml프로그래밍 리스트 스크롤바 만들기1(qml scrollbar 사용하기) (0) | 2019.09.08 |
[C++,QT/Qml]21.Qml프로그래밍 동적 리스트 만들기7(체크박스 리스트 삭제) (0) | 2019.09.08 |