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



我一直在尝试学习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"one_answers"QDeclaritiveView"之类的东西,但我似乎在官方文档中根本找不到它们。。

我对QtQuick感到非常沮丧;QML的"简单性"似乎在C++和QML之间的文档冲突和复杂接口的海洋中消失了。在使用QQmlApplicationEngine方法时,我是否可以访问QML对象?我尝试过使用"QuickView",但它似乎不能很好地与Window QML对象配合使用。。?QQmlApplicationEngine是否仅适用于单个文件中仅限QML的应用程序?到目前为止,我读过的每一篇文档和教程都显示了一些不同的东西。。

如有任何帮助或澄清,我们将不胜感激理想情况下,我想知道如何通过C++代码访问和修改QML对象(如"mainWindow"、"testRect"和其他文件中的其他对象)

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

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

  • 对于根对象,可以省略下一步,但对于一般的"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*名称,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属性。

相关内容

  • 没有找到相关文章

最新更新