Embedding C++ Objects into QML with Context Properties

Qt 2017. 6. 11. 17:42

[원문] https://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html


Embedding C++ Objects into QML with Context Properties

QML 객체를 C ++ 응용 프로그램에로드 할 때 QML 코드 내에서 사용할 수있는 일부 C ++ 데이터를 직접 포함시키는 것이 유용 할 수 있습니다. 예를 들어, 포함 된 객체에서 C ++ 메소드를 호출하거나 C ++ 객체 인스턴스를 QML 뷰의 데이터 모델로 사용할 수 있습니다.


C ++ 데이터를 QML 객체에 삽입하는 기능은 QQmlContext 클래스를 통해 가능합니다. 이 클래스는 데이터를 QML 객체의 컨텍스트에 노출하여 QML 코드의 범위 내에서 직접 데이터를 참조 할 수 있도록합니다.


Setting a Simple Context Property

예를 들어, 현재 범위에 존재하지 않는 currentDateTime 값을 참조하는 QML 항목이 있습니다.
// MyItem.qml
import QtQuick 2.0

Text { text: currentDateTime }

이 currentDateTime 값은 QQmlContext :: setContextProperty ()를 사용하여 QML 구성 요소를로드하는 C ++ 응용 프로그램에서 직접 설정할 수 있습니다.

QQuickView view;
view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();

참고 : QML에서 평가 된 모든 표현식은 특정 컨텍스트에서 평가되므로 컨텍스트가 수정되면 해당 컨텍스트의 모든 바인딩이 다시 평가됩니다. 따라서 컨텍스트 속성은 응용 프로그램 초기화 외부에서주의하여 사용해야합니다. 그러면 응용 프로그램 성능이 저하 될 수 있습니다.

Setting an Object as a Context Property

컨텍스트 속성은 QVariant 또는 QObject * 값을 포함 할 수 있습니다. 즉,이 방법을 사용하여 사용자 지정 C ++ 개체를 삽입 할 수 있으며 이러한 개체를 수정하고 QML에서 직접 읽을 수 있습니다. 여기에서는 QDateTime 값 대신 QObject 인스턴스를 포함하도록 위의 예를 수정하고 QML 코드는 객체 인스턴스에 대한 메서드를 호출합니다.

C++
class ApplicationData : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE QDateTime getCurrentDateTime() const {
        return QDateTime::currentDateTime();
    }
};

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

    QQuickView view;

    ApplicationData data;
    view.rootContext()->setContextProperty("applicationData", &data);

    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
    view.show();

    return app.exec();
}
QML
// MyItem.qml
import QtQuick 2.0

Text { text: applicationData.getCurrentDateTime() }

(C ++에서 QML로 반환 된 날짜 / 시간 값은 Qt.formatDateTime () 및 관련 함수를 통해 형식화 할 수 있습니다.)


QML 항목이 컨텍스트 속성에서 신호를 수신해야하는 경우 연결 유형을 사용하여 신호에 연결할 수 있습니다. 예를 들어 ApplicationData에 dataChanged ()라는 신호가 있으면이 신호는 Connections 객체 내의 onDataChanged 핸들러를 사용하여 연결할 수 있습니다.

Text {
    text: applicationData.getCurrentDateTime()

    Connections {
        target: applicationData
        onDataChanged: console.log("The application data changed!")
    }
}

컨텍스트 속성은 QML 뷰에서 C ++ 기반 데이터 모델을 사용할 때 유용 할 수 있습니다. 다음 예제를 참조하십시오.


    > String ListModel

    > Object ListModel

    > AbstractItemModel


QStringList, QList <QObject *> 기반 모델 및 QAbstractItemModel을 QML 뷰에서 사용하는 방법을 보여줍니다.


자세한 정보는 QQmlContext 문서를 참조하십시오.

'Qt' 카테고리의 다른 글

Data Type Conversion Between QML and C++  (0) 2017.06.11
Interacting with QML Objects from C++  (0) 2017.06.11
Defining QML Types from C++  (0) 2017.06.10
Exposing Attributes of C++ Types to QML  (0) 2017.06.10
Intergrating QML and C++  (0) 2017.06.10
: