我一直在努力学习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'和其他文件中的其他对象)。

===============>>#1 票数:47 已采纳

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

  • 通过视图获取您的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属性

  ask by MrKatSwordfish translate from so

未解决问题?本站智能推荐:

2回复

QML:如何自定义组件并在同一文件中使用它

QML中是否有某种语法可以像这样在同一文件中定义和使用组件?
3回复

GUI屏幕转换如何在qml中工作

我是一名C ++开发人员,现在在QtQuick中使用QML研究GUI开发。 在GUI创建中,用户只能看到一个屏幕。 并且基于用户交互,切换屏幕。 但究竟背后发生了什么? 关于如何设计单个屏幕有很多信息,但是如何管理其状态转换的资源却非常少。 是否在启动应用程序时加载了所有屏
3回复

如何在QML中创建圆形鼠标区域

我有一个基本的自定义按钮使用矩形radius: width/2 。 现在我将MouseArea添加到我的按钮。 但是MouseArea的形状是方形的。 这意味着当我在圆形按钮外稍微点击时,也就是在圆形按钮周围的假想方块的角落中,也会触发click事件。 我可以以某种方式使MouseAre
3回复

如何从C ++访问嵌套的QML对象?

这是一个可重复的例子: main.qml main.cpp中 我希望访问该property的QML Item的一些text 。 上述方法没有产生所需的结果。 怎么做?
1回复

我应该使用QVariant或MyCustomType *将对象从Qml传递给C ++吗?

我有C ++类User 我还有带按钮的Qml SignIn表单,单击时调用此代码: SignInInteractor是一个C ++类 我的问题是我应该使用User*或QVariant作为参数类型吗? 他们有什么优点和缺点?
1回复

用C ++改变QML单例的属性

我正在实现一个简化的Ubuntu Touch-like调色板(不是每个元素一个)。 有一个GlobalPaletteSetting单例: 以及一些调色板类,如NonePalette或Dark : 因此,可以在QML中更改全局调色板: 我想通过设置环境变量来设置全局调
1回复

如何在QtQuick2Con​​trolsApplicationViewer上绑定QML / C ++类

目前,我正在通过QtCreator3.0.0,Qt5.2.0和MSVC2012开发QtQuick应用程序。 我想制作一个从qml调用C ++函数的应用程序。 基于本文 。 当我将QtQuick2ApplicationViewer用于QtQuick2应用程序时,它可以工作。 [main
1回复

在QML中使用c ++枚举作为字符串

我想要做的是在c ++中使用以下枚举: 在QML中以这种方式: 这将导致enumValue is MyEnumElement而不是enumValue is 0现在enumValue is 0 。 我现在的解决方案是以下,但不优雅: 和: 有一个更好的方法吗?
2回复

使用别名和C ++集成在.qml中实现.ui文件的逻辑

我正在尝试将C ++类与QML连接,但无法在单独的qml文件中实现该逻辑。 当我直接在ui.qml文件中添加功能时,它可以工作,但出现警告: Qt Quick UI表单不支持功能 我曾尝试使用别名,但由于某种原因,它无法正常工作。 这是代码: ReasonsForm.
3回复

从C ++代码创建单独的QML窗口

在我的应用程序中,我想用C ++代码创建另一个带有QML UI的窗口。 我知道可以使用QML Window类型创建另一个窗口,但我需要C ++代码中的相同内容。 到目前为止,我设法将我的额外qml文件加载到QQmlComponent: 如何在单独的窗口中显示它?