이 예제는 signal slot을 활용하여 QML에서 C++이 아닌 C++에서 QML로 데이터 전송하여 출력하는 예제입니다.
#include <QGuiApplication>
#include <QQmlApplicationEngine>
//#include "myclass.h"
#include <ConnectEvent.h>
#include <QQuickView>
int main(int argc, char *argv[]) {
// QML 불러오기
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl::fromLocalFile("main.qml"));
ConnectEvent *event = new ConnectEvent();
QObject *root = engine.rootObjects()[0];//qrc:/main.qml를 등록한 엔진의 object값을 가져옴
event->setWindow(qobject_cast<QQuickWindow *>(root));//qrc:/main.qml를 등록한 엔진의 object값을 window타입으로 변경해준다.
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
#include "ConnectEvent.h"
ConnectEvent::ConnectEvent()
{
}
ConnectEvent::~ConnectEvent()
{
}
void ConnectEvent::cppSignaltoQmlSlot()
{
QObject::connect(this, SIGNAL(cppSignaltestData(QVariant)), mMainView, SLOT(qmlSlotTestData(QVariant)));//시그널과 슬롯을 연결해주는 connection
emit cppSignaltestData("값 전송됨");//cpp에서 시그널을 호출하는 부분 매개변수에 3을 넣어서 3이 qml함수에 전달됨
emit cppSignaltestData("이건 log ");
emit cppSignaltestData("test");
emit cppSignaltestData(10); // 아래 단 부터 추가됨
}
void ConnectEvent::textChange()
{
QObject::connect(this, SIGNAL(textChange(QVariant)), mMainView, SLOT(qmlSlotTestData(QVariant)));//시그널과 슬롯을 연결해주는 connection
emit textChange("체인지 해보기");
}
void ConnectEvent::setWindow(QQuickWindow* Window)
{
mMainView = Window;//connection을 해주기 위해 윈도우를 등록
cppSignaltoQmlSlot();//윈도우 등록과 동시에 connection 등록
}
#ifndef CONNECTEVENT_H
#define CONNECTEVENT_
#include <QQuickView>
#include <QObject>
class ConnectEvent : public QObject//connection을 사용하기 위해 상속 받아야 하는 클래스
{
public:
Q_OBJECT//솔직히 왜 추가해야하는지는 모르겠지만 추가를 안하면 connection할때 에러 난다(추후에 알아 보도록 하겠다.)
//그리고 Q_OBJECT 추가한 후 Build->Run qmake를 해주자(중요!!)
public:
ConnectEvent();
~ConnectEvent();
void cppSignaltoQmlSlot();//cpp에서 시그널을 날리고 qml 에서 받기위해 connection을 해두는 함수
void textChange(); // cpp에서 signal 날리기 textchange
void setWindow(QQuickWindow* Window);
private:
QQuickWindow* mMainView;
signals://클래스에서 signal등록 하는 방법
void cppSignaltestData(QVariant);
void textChange(QVariant);
};
#endif // CONNECTEVENT_H
import QtQuick 2.9
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
import "."
Window {
property bool mbImageClicked : true
property int mCount : 0
visible: true
width: 640
height: 480
title: qsTr("Hello World")
function qmlSlotTestData(string){//slot으로 등록한 함수
console.log("qmlSlotTestData data:" + string);
lbl.text = string;
}
Label {
id: lbl;
font.bold: true;
font.pixelSize: 28;
text: "test";
//text: textChange(string);
anchors.centerIn: parent;
}
}
function qmlSlotTestData(string){//slot으로 등록한 함수
console.log("qmlSlotTestData data:" + string);
lbl.text = string;
}
화면 출력 시 lbl.text = string;은 전달 받은 값에 대해서 변경이 됩니다.
만약 lbl.text = string;이 없는 경우 Label 부분에서 test로 표시됩니다.
이 예제는 c++ qml signal slot을 이용해서 Text 변환이 가능한 예제 입니다.
만약 c++에서 QML로 log, 값 전송만 필요한 경우 lbl.text 부분을 지우면됩니다.
[C++ QT QML] QML 새로운 DelegateChooser 구현하기 (0) | 2021.06.16 |
---|---|
[C++ QT QML] 리눅스에서 QML WIFI list 불러오게 구현 (0) | 2021.06.16 |
[C++ QT QML] Signal slot 활용하여 화면 클릭 시 이벤트 처리 (0) | 2021.06.15 |
[C++ QT widget] Linux Ubuntu에서 Makefile, qmake, .pro 설명 및 화면 구현하기 (0) | 2021.06.14 |
[C++ QT QML] Linux Ubuntu에서 Makefile 만들기 버전[2](Windows/Ubuntu) (0) | 2021.06.14 |