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

标签 c++ qt user-interface qml qtquick2

我一直在尝试学习 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 对象,因此,我无法更改它的任何属性或其属性 children ! QtQuick 文档的这一部分显示了从 C++ 代码中访问 QML 对象的两种方法,但它们似乎都不适用于这种“QQmlApplicationEngine”加载方案。我还看到人们使用“QApplicationViewer”和“QDeclaritiveView”之类的东西,但我似乎根本无法在官方文档中找到这些内容..

我对 QtQuick 感到非常沮丧; QML 的“简单性”似乎在大量相互冲突的文档和 C++ 和 QML 之间复杂的接口(interface)中消失了。在使用 QQmlApplicationEngine 方法时,我是否可以访问我的 QML 对象?我试过使用“QuickView”,但它似乎不适用于 Window QML 对象..? QQmlApplicationEngine 是否仅对单个文件中的仅 QML 应用程序有用?到目前为止,我读过的每篇文档和教程都显示了一些不同的东西..

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

最佳答案

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

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

  • 对于根对象可以省略下一步,但对于“qml 对象”,一般来说,您需要有 objectName property设置,然后您可以使用以下方法找到任何 child :

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 .

关于c++ - 如何在使用 QQmlApplicationEngine 时从 C++ 访问我的 Window 对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177839/

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

C++ 简单但棘手的递归

c++ - 用qt制作C++库

windows - 应用程序无法从 Creator 启动

windows - 在没有 Linux 服务器的 Windows 10 主机上的 Docker 容器中显示 GUI 应用程序

c++ - 初学者 C++ 程序员的 gui 库

Java Swing - 单击按钮后完成计算时 GUI 卡住

c++ - DirectX 10 将文本绘制到纹理

c++ - 如何使用用户定义的密码初始化 AES-256 key

c++ - Q电影。如何设置循环次数?