공부/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을 이용한 방법이 있다고 한다.
(왜 여러가지로 만드셨나요 다른건 이해하기 더 힘든거 같은데..)
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;
}
반응형