상세 컨텐츠

본문 제목

[C++ QT QML] Signal slot으로 C++에서 QML로 데이터 전송

QT|QML

by donggyu1998 2021. 6. 15. 12:13

본문

반응형

이 예제는 signal slot을 활용하여 QML에서 C++이 아닌 C++에서 QML로 데이터 전송하여 출력하는 예제입니다.

💡 실행 사진

💡 main.cpp

#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();
}

💡 ConnectEvent.cpp

#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 등록
}

💡 ConnectEvent.h

#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
 

💡 main.qml

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 부분을 지우면됩니다.

 

반응형

관련글 더보기