bool 타입 설정값 testBoolean을 qml 로 전달하는 방법

 

1. 전달할 값에 대해 PROPERTY를 생성한다.

ㄱ. Q_PROPERTY 는 아래와 같은 형식으로 생성

Q_PROPERTY(type name READ name WRITE setname NOTIFY nameChanged)

타입(type)과 읽을 때 함수(READ), 수정 시 함수(WRITE), 변경 시 호출할 시그널(NOTIFY) 작성

ex) bool 타입의 testBoolean 값을 전달하기 위함

Q_PROPERTY(bool testBoolean READ testBoolean WRITE setTestBoolean NOTIFY testBooleanChanged)

 

2. PROPERTY에 맞는 함수 작성

ㄱ. 읽을 때 함수는 m_testBoolean값을 반환하도록 작성

public:

bool testBoolean();

ㄴ. 수정 시 함수는 bool 타입의 인자를 전달받아 m_testBoolean 변경 및 testBooleanChanged 시그널을 발생하도록 작성

public:

void setTestBoolean(bool value);

signals:

void testBooleanChanged(const bool value);

 

3. qml에서 전달 받기

ㄱ. main 함수 내에서 지정한 property 이름을 사용하여 조건문 수행

Text {
text: {
if (propertyTest.testBoolean)
" testBoolean is true"
else
" testBoolean is false"
}
}

% 조건문에 사용된 propertyTest는 main.cpp 내 QQmlApplicationEngine의 rootContext아래 setContextProperty를 활용하여 임의 생성된 property 임

 

4. 예제코드
- main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "qpropertytest.h"

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

QPropertyTest* propertyTest = new QPropertyTest;

QQmlApplicationEngine engine;

engine.rootContext()->setContextProperty("propertyTest", propertyTest);

engine.rootContext();
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;

return app.exec();
}


- qpropertytest.h

#ifndef QPROPERTYTEST_H
#define QPROPERTYTEST_H

#include <QObject>

class QPropertyTest : public QObject
{
Q_OBJECT

Q_PROPERTY(bool testBoolean READ testBoolean WRITE setTestBoolean NOTIFY testBooleanChanged)

private:
bool m_testBoolean;

public:
QPropertyTest(QObject *parent = nullptr);

bool testBoolean();
void setTestBoolean(bool value);

signals:
void testBooleanChanged(const bool value);
};

#endif // QPROPERTYTEST_H

 

- qpropertytest.cpp

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

QPropertyTest::QPropertyTest(QObject *parent) : QObject(parent)
{
m_testBoolean = true;
}

bool QPropertyTest::testBoolean()
{
return m_testBoolean;
}

void QPropertyTest::setTestBoolean(bool value)
{
qDebug() << "QPropertyTest::setTestBoolean value:" << value;
m_testBoolean = value;
emit testBooleanChanged(value);
}


- main.qml

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
visible: true
width: 640
height: 100
title: qsTr("QPropertyTest")

Text {
text: {
if (propertyTest.testBoolean)
" testBoolean is true"
else
" testBoolean is false"
}
}
}

 

수행결과

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다