首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用C++时从QQmlApplicationEngine访问窗口对象属性?

如何在使用C++时从QQmlApplicationEngine访问窗口对象属性?
EN

Stack Overflow用户
提问于 2014-04-20 02:38:01
回答 1查看 25.2K关注 0票数 42

我一直在尝试学习QtQuick来创建GUI,但我一直很难理解如何从测试程序的C++部分与QML对象交互。

下面是我的简单QML文件:

代码语言:javascript
复制
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自动生成):

代码语言:javascript
复制
#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();
}

我的问题是,我不知道如何访问我的“窗口”QML对象,因此,我无法更改它的任何属性或其子对象的属性!QtQuick文档的这一部分展示了从C++代码中访问QML对象的两种方法,但这两种方法似乎都不适用于这种“QQmlApplicationEngine”加载方案。我也见过人们使用“QApplicationViewer”和“QDeclaritiveView”之类的东西,但我似乎在官方文档中根本找不到。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-20 05:17:37

把我的评论变成一个恰当的答案:这通常有两种方法:

  • 如果直接使用QQuickView或仅使用QQmlApplicationEngine,则通过视图获取QML场景的根对象。
  • 对于根对象,可以省略下一步,但对于"qml对象“,通常需要设置objectName性质,然后可以使用以下方法找到任何子级:

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

C++侧

代码语言:javascript
复制
#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();
}

请参阅属性集的文档,并在正式文档中获得:

(名称,const QVariant & value)

(名称)

很好,我们现在或多或少已经完成了C++方面的工作。

QML侧

如果您希望访问的不仅仅是根项,您还需要设置qml对象的objectName属性,如下所示:

代码语言:javascript
复制
import QtQuick 2.2
import QtQuick.Window 2.1

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

类似地,对于任何QML对象都可以这样做。这里的关键是"objectName“。您可以省略根对象,因为C++端直接获取根对象,但是由于您在问题中引用的是QML对象,所以我假设您通常希望解决它。一旦您希望对任何QML对象(包括子对象)执行同样的操作,您将需要使用objectName性质

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23177839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档