我一直在努力学习用于GUI创建的QtQuick,但是我一直很难理解如何从我的测试程序的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对象,结果,我也看到人们使用像'QApplicationViewer'和'QDeclaritiveView'这样的东西,但我似乎无法在官方找到那些文档根本..
我对QtQuick感到非常沮丧; QML的“简单性”似乎在C和QML之间存在冲突的文档和错综复杂的界面中丢失 . 无论如何我在使用QQmlApplicationEngine方法时访问我的QML对象?我尝试过使用'QuickView',但它似乎不适用于Window QML对象..? QQmlApplicationEngine仅对单个文件中的QML应用程序有用吗?到目前为止,我读过的每一篇文档和教程都显示了不同的东西......
任何帮助或澄清将不胜感激 . Ideally I'd like to know how to access and modify QML objects (like 'mainWindow', 'testRect', and other objects in other files) via my C++ code.
1 回答
将我的评论转化为正确的答案:这通常通过两种方法完成:
如果直接使用
QQuickView
或仅使用QQmlApplicationEngine
,则通过视图获取QML场景的根对象 .对于根对象,可以省略下一步,但对于"qml objects",通常需要设置objectName property,然后您可以使用以下方法找到任何子对象:
C方
请参阅属性集的文档并获取官方文档:
和
好的,我们现在或多或少都在C方面完成了 .
QML方面
如果您希望访问的不仅仅是根项目,还需要设置qml对象的
objectName
属性,如下所示:对于任何QML对象,都可以这样做 . 关键是"objectName"在这里 . 您可以省略对于根对象,因为C端直接获取根对象,但由于您在问题中引用了QML对象,我假设您希望一般地解决它 . 一旦你想对任何QML对象(包括孩子)做同样的事情,你将需要使用objectName property .