1. setContextProperty()
setContextProperty의 함수를 이용하여 C++ 파일에서 qml에서 선택된 버튼의 ObjectName을 알아보자.

[Main.cpp]

[code language=”cpp”] #include <QtGui/QGuiApplication>
#include <QtQml/QQmlContext>
#include <QQuickView>
#include <QtQml>
#include "qtquick2applicationviewer.h"

#include <QDebug>
#include "HandlerTest.h"

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
HandlerTest handlerTest;

QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Study/main.qml"));
viewer.rootContext()->setContextObject(&handlerTest);
viewer.rootContext()->setContextProperty("myObject", &handlerTest);

}[/code]

[HandlerTest.cpp]

[code language=”cpp”] void HandlerTest:: test(QString name){
qDebug()<<"==[JOO]== test == name :: "<< name;
}[/code]

[main.qml]을 MainQmlFile로 설정한 뒤, 해당 qml에 HandlerTest.cpp을 contextObject로 지정한다.
HandlerTest를 myObjcet의 별칭을 사용하여 qml에서 호출 가능하도록 구현한다.

[main.qml]

[code language=”cpp”] Button{
id:btn1
x:100
y:150
_Width : 150
_Height :50
_BtnColor :"gray"
_BtnText :"3. C++ -> QML"
objectName: "btn1"
}[/code]

[Button.qml]

[code language=”cpp”] import QtQuick 2.0

Rectangle {
id:parent
property int _Width ;
property int _Height ;
property string _BtnText :"";
property color _BtnColor ;

width: _Width;
height: _Height
color: _BtnColor

Text {
id: btnText
anchors.centerIn: parent
text:qsTr(_BtnText)
}

MouseArea {
anchors.fill: parent
onClicked: {
myObject.test("Clicked the button ObjectName is "+ parent.objectName);
}
}
}[/code]

버튼을 보여주기 위해 customize 하여 [Button.qml]을 생성한 후, [main.qml]에서 Button의 객체를 사용하였다.
[Main.cpp] 화면의 “3. C++ -> QML”의 text를 가진 버튼을 선택하게 되면, [Button.qml]의 onClicked의 Handler가 호출 될것이다.

이때, OnClicked 함수 안에서 [Main.cpp]에서 handlerTest를 myObject의 별칭으로 사용하겠다고 선언되어있으니, myObject로 handlerTest안의 method 호출이 가능해 졌다. 호출 시 qml의 objectName을 전달해 주면 handlerTest의 test함수안의 로그에 qml로 부터 넘어온 objectName을 확인 할 수 있게 된다.

2. Connection을 이용한 방법

Connection을 사용하기 위해서는 Signal과 Slot을 반드시 사용해야 하며,
Signal은 Event를 발생하는 역할이며, Slot은 발생 된 이벤트를 처리하기 위한 역할로 이해하면 되겠다.

Connection을 이용하여 1번과 동일하게 main화면에서 선택된 버튼의 objectName을 알아보겠다.
[main.cpp]

[code language=”cpp”] QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Study/main.qml"));
viewer.showExpanded();

QQuickItem *pQuickItem = viewer.rootObject();

QObject::connect((QObject*)pQuickItem,
SIGNAL(mainTest(QString)),
&handlerTest,
SLOT(test(QString)));[/code]

[main.cpp] 함수에서 [main.qml]안에서 mainTest()의 signal이 발생되면, [HandlerTest.cpp]함수의 test() Slot이 처리될 수 있도록 연결해 주었다. qml 화면의 여러곳에서 Signal을 발생시켜 동일한 결과를 얻고자 할때 Slot에 정의된 함수에서 처리 시키면 된다.

[Main.qml]

[code language=”cpp”] …
signal mainTest(string name);

Button{
id:btn1
x:100
y:150
_Width : 150
_Height :50
_BtnColor :"gray"
_BtnText :"3. C++ -> QML"
objectName: "btn1"
}[/code]

[Button.qml]

[code language=”cpp”] …
MouseArea {
anchors.fill: parent
onClicked: {
mainTest("Clicked the button ObjectName is "+ parent.objectName);
}
}
…[/code]

qml 파일에는 반드시 [Main.cpp]에서 signal로 선언된 함수가 정의되어야 한다.
또한 1번과 같이 “3. C++ -> QML”의 text를 가진 버튼을 선택하게 되면, [Button.qml]의 onClicked의 Handler가 호출되고,
onClicked 함수안에서 qml에서 정의된 mainTest()의 Signal을 발생 시키면, QT 시스템에서 connection으로 연결된 [HandlerTest.cpp]의 test()를 호출해 준다. test() 함수에서 넘어온 인자값을 Log로 찍어 objectName을 확인 한다.

결과 : ==[JOO]== test == name :: “Clicked the button ObjectName is btn1”

Handler Event in Qml     |