공부/QT

[QT] QQmlContext(setContextProperty 함수)를 이용하여 qml 객체의 속성 값을 C++ 클래스 멤버변수에 대입하는 방법

이니셜P 2023. 8. 13. 01:11
반응형

C++과 qml이 상호작용 하는 방법 중 하나인 setContextProperty 함수를 이용한 방법이다.

 

Button을 클릭(onClicked)하면 main.cpp에서 setContextProperty 함수로 등록한 Indicator 클래스의 슬롯 sendSignal이 호출되고 SendSignal에 정의되어 있던 SignalSent 시그널이 호출되어 qml에서 onSignalSent로 시그널을 감지하고 getIndicatorVisible 슬롯을 호출해서 Indicator qml 객체의 visible 속성 값을 Indicator C++ 클래스의 멤버변수로 받아오고 그 값을 디버그 창을 통해 출력하는 예이다.

 

C++과 qml이 상호작용 하는 방법은 여러가지가 있으나 대표적인 방법 2가지는

setContextProperty 함수를 이용한 방법과 qmlRegisgerType을 이용한 방법이 있다고 한다.

 

(왜 여러가지로 만드셨나요 다른건 이해하기 더 힘든거 같은데..)

 

https://gun-ny.tistory.com/47

qmlRegisterType을 이용한 방법도 겉핥기식으로 후딱 터득하고 바로 글을 써봤다.

 


main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QQmlContext>

#include "indicator.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    Indicator indicator;
    engine.rootContext()->setContextProperty("Indicator", &indicator);

    engine.load(QUrl("qrc:/untitled/Main.qml"));

    return app.exec();
}

 

Main.qml

import QtQuick
import QtQuick.Controls

Window {
    width: 360
    height: 570
    visible: true
    title: qsTr("Gunny Arduino Control")

    Connections {
        target: Indicator
        onLeftSignalSent: {
            Indicator.getLeftIndicatorVisible(leftIndicator.visible);
        }
        onRightSignalSent: {
            Indicator.getRightIndicatorVisible(rightIndicator.visible);
        }
    }

    BusyIndicator {
        id: leftIndicator
        x: 40
        y: 15
        width: 100
        height: 100
        visible: true
    }

    BusyIndicator {
        id: rightIndicator
        x: 220
        y: 15
        width: 100
        height: 100
        visible: false;
    }

    Button {
        id: leftButton
        x: 5
        y: 140
        width: 170
        height: 300
        text: qsTr("좌측 깜빡이")
        onClicked: {
            Indicator.sendLeftSignal();
        }
    }

    Button {
        id: rightButton
        x: 185
        y: 140
        width: 170
        height: 300
        text: qsTr("우측 깜빡이")
        onClicked: {
            Indicator.sendRightSignal();
        }
    }

    Button {
        id: hazardButton
        x: 5
        y: 450
        width: 350
        height: 100
        text: qsTr("비상등")
    }
}

 

indicator.h

#pragma once

#include <QObject>

#include <QDebug>

class Indicator : public QObject
{
    Q_OBJECT

public:
    Indicator(QObject *parent = nullptr);

signals:
    void leftSignalSent();
    void rightSignalSent();

public slots:
    void sendLeftSignal();
    void sendRightSignal();
    void getLeftIndicatorVisible(bool visible);
    void getRightIndicatorVisible(bool visible);

private:
    bool leftIndicatorVisible;
    bool rightIndicatorVisible;
};

 

indicator.cpp

#include "indicator.h"

Indicator::Indicator(QObject *parent) : QObject(parent)
{
}

void Indicator::sendLeftSignal()
{
    emit leftSignalSent();
}

void Indicator::sendRightSignal()
{
    emit rightSignalSent();
}

void Indicator::getLeftIndicatorVisible(bool visible)
{
    leftIndicatorVisible = visible;

    qDebug() << "LeftIndicatorVisible Value : " << leftIndicatorVisible;
}

void Indicator::getRightIndicatorVisible(bool visible)
{
    rightIndicatorVisible = visible;

    qDebug() << "RightIndicatorVisible Value : " << rightIndicatorVisible;
}
반응형