我一直在尝试学习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();
}我的问题是,我不知道如何访问我的“窗口”QML对象,因此,我无法更改它的任何属性或其子对象的属性!QtQuick文档的这一部分展示了从C++代码中访问QML对象的两种方法,但这两种方法似乎都不适用于这种“QQmlApplicationEngine”加载方案。我也见过人们使用“QApplicationViewer”和“QDeclaritiveView”之类的东西,但我似乎在官方文档中根本找不到。
我对QtQuick感到非常沮丧;QML的“简单性”似乎在大量相互冲突的文档和C++与QML之间复杂的接口中丢失。在使用QQmlApplicationEngine方法时,我是否可以访问QML对象?我试过使用“QuickView”,但它似乎不能很好地处理Window QML对象。QQmlApplicationEngine只对单个文件中的QML应用程序有用吗?到目前为止,我读过的每一篇文档和教程都显示了一些不同的东西。
如有任何帮助或澄清,将不胜感激。理想情况下,我想知道如何通过我的代码访问和修改QML对象(如'mainWindow‘、'testRect’和其他文件中的其他对象)。
发布于 2014-04-20 05:17:37
把我的评论变成一个恰当的答案:这通常有两种方法:
QQuickView或仅使用QQmlApplicationEngine,则通过视图获取QML场景的根对象。QList QObject::findChildren(const QString & name = QString(),Qt::findChildren options选项= Qt::FindChildrenRecursively)
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();
}请参阅属性集的文档,并在正式文档中获得:
(名称,const QVariant & value)
和
(名称)
很好,我们现在或多或少已经完成了C++方面的工作。
QML侧
如果您希望访问的不仅仅是根项,您还需要设置qml对象的objectName属性,如下所示:
import QtQuick 2.2
import QtQuick.Window 2.1
Window {
id: mainWindow
objectName: "mainWindow"
...
}类似地,对于任何QML对象都可以这样做。这里的关键是"objectName“。您可以省略根对象,因为C++端直接获取根对象,但是由于您在问题中引用的是QML对象,所以我假设您通常希望解决它。一旦您希望对任何QML对象(包括子对象)执行同样的操作,您将需要使用objectName性质。
https://stackoverflow.com/questions/23177839
复制相似问题