[英]How do I access and call Javascript Object properties and methods from C++ using V8?
[英]How can I access my Window object properties from C++ while using QQmlApplicationEngine?
我一直在努力学习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'和其他文件中的其他对象)。
将我的评论转化为正确的答案:这通常通过两种方法完成:
通过视图获取您的QML场景的根对象,如果你使用QQuickView
或只是QQmlApplicationEngine
直接。
对于根对象,可以省略下一步,但对于“qml对象”,通常需要设置objectName属性 ,然后可以使用以下方法找到任何子对象:
#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)
和
好的,我们现在或多或少都在C ++方面完成了。
如果您希望访问的不仅仅是根项目,还需要设置qml对象的objectName
属性,如下所示:
import QtQuick 2.2
import QtQuick.Window 2.1
Window {
id: mainWindow
objectName: "mainWindow"
...
}
对于任何QML对象,都可以这样做。 关键是这里的“objectName”。 您可以省略对于根对象,因为C ++端直接获取根对象,但由于您在问题中引用QML对象,我认为您通常希望解决它。 一旦您希望对任何QML对象(包括子对象)执行相同操作,您将需要使用objectName属性 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.