簡體   English   中英

如何在使用QQmlApplicationEngine時從C ++訪問我的Window對象屬性?

[英]How can I access my Window object properties from C++ while using QQmlApplicationEngine?

我一直在努力學習QtQuick用於GUI創建,但我一直很難理解如何從我的測試程序的C ++部分與QML對象進行交互。

這是我簡單的QML文件:

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    id: mainWindow
    visible: true
    width: 800
    height: 800
    color: "#FFFF0000"

    MouseArea {
        anchors.fill: parent
        onClicked: Qt.quit()
    }

    Rectangle {
        id: testRect
        width: 100
        height: 100
        anchors.centerIn: parent
        color: "#FF0000FF"
    }
}

這是隨附的基本C ++文件(由QtCreator自動生成):

#include <QGuiApplication>
#include <QQmlApplicationEngine>

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

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

我的問題是我不知道如何訪問我的'Window'QML對象,因此,我無法改變它的任何屬性或其子項的屬性! QtQuick文檔的這一部分顯示了從C ++代碼中訪問QML對象的兩種方法,但它們似乎都不適用於這個'QQmlApplicationEngine'加載方案。我也看到人們使用'QApplicationViewer'和'QDeclaritiveView'之類的東西,但我似乎無法在官方文檔中找到那些..

我對QtQuick感到非常沮喪; QML的“簡單性”似乎在C ++和QML之間存在沖突的文檔和錯綜復雜的界面中丟失。 無論如何我在使用QQmlApplicationEngine方法時訪問我的QML對象? 我嘗試過使用'QuickView',但它似乎不適用於Window QML對象..? QQmlApplicationEngine僅對單個文件中的QML應用程序有用嗎? 到目前為止,我讀過的每一篇文檔和教程都顯示了不同的東西......

任何幫助或澄清將不勝感激。 理想情況下,我想知道如何通過我的C ++代碼訪問和修改QML對象(如'mainWindow','testRect'和其他文件中的其他對象)。

將我的評論轉化為正確的答案:這通常通過兩種方法完成:

  • 通過視圖獲取您的QML場景的根對象,如果你使用QQuickView或只是QQmlApplicationEngine直接。

  • 對於根對象,可以省略下一步,但對於“qml對象”,通常需要設置objectName屬性 ,然后可以使用以下方法找到任何子對象:

QList QObject :: findChildren(const QString&name = QString(),Qt :: FindChildOptions options = Qt :: FindChildrenRecursively)const

C ++方面

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>

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

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    // Step 1: get access to the root object
    QObject *rootObject = engine.rootObjects().first();
    QObject *qmlObject = rootObject->findChild<QObject*>("mainWindow");

    // Step 2a: set or get the desired property value for the root object
    rootObject->setProperty("visible", true);
    qDebug() << rootObject->property("visible");

    // Step 2b: set or get the desired property value for any qml object
    qmlObject->setProperty("visible", true);
    qDebug() << qmlObject->property("visible");

    return app.exec();
}

請參閱屬性集的文檔並獲取官方文檔:

bool QObject :: setProperty(const char * name,const QVariant&value)

QVariant QObject :: property(const char * name)const

好的,我們現在或多或少都在C ++方面完成了。

QML方面

如果您希望訪問的不僅僅是根項目,還需要設置qml對象的objectName屬性,如下所示:

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    id: mainWindow
    objectName: "mainWindow"
    ...
}

對於任何QML對象,都可以這樣做。 關鍵是這里的“objectName”。 您可以省略對於根對象,因為C ++端直接獲取根對象,但由於您在問題中引用QML對象,我認為您通常希望解決它。 一旦您希望對任何QML對象(包括子對象)執行相同操作,您將需要使用objectName屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM