首页 文章

如何在使用QQmlApplicationEngine时从C访问我的Window对象属性?

提问于
浏览
37

我一直在努力学习用于GUI创建的QtQuick,但是我一直很难理解如何从我的测试程序的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对象,结果,我也看到人们使用像'QApplicationViewer'和'QDeclaritiveView'这样的东西,但我似乎无法在官方找到那些文档根本..

我对QtQuick感到非常沮丧; QML的“简单性”似乎在C和QML之间存在冲突的文档和错综复杂的界面中丢失 . 无论如何我在使用QQmlApplicationEngine方法时访问我的QML对象?我尝试过使用'QuickView',但它似乎不适用于Window QML对象..? QQmlApplicationEngine仅对单个文件中的QML应用程序有用吗?到目前为止,我读过的每一篇文档和教程都显示了不同的东西......

任何帮助或澄清将不胜感激 . Ideally I'd like to know how to access and modify QML objects (like 'mainWindow', 'testRect', and other objects in other files) via my C++ code.

1 回答

  • 44

    将我的评论转化为正确的答案:这通常通过两种方法完成:

    • 如果直接使用 QQuickView 或仅使用 QQmlApplicationEngine ,则通过视图获取QML场景的根对象 .

    • 对于根对象,可以省略下一步,但对于"qml objects",通常需要设置objectName property,然后您可以使用以下方法找到任何子对象:

    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 property .

相关问题