Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C+;访问窗口对象属性+;在使用QQmlApplicationEngine时? 我一直在尝试学习QTQuy来创建GUI,但我一直很难理解如何从我的测试程序的C++部分与QML对象进行交互。_C++_Qt_User Interface_Qml_Qtquick2 - Fatal编程技术网

如何从C+;访问窗口对象属性+;在使用QQmlApplicationEngine时? 我一直在尝试学习QTQuy来创建GUI,但我一直很难理解如何从我的测试程序的C++部分与QML对象进行交互。

如何从C+;访问窗口对象属性+;在使用QQmlApplicationEngine时? 我一直在尝试学习QTQuy来创建GUI,但我一直很难理解如何从我的测试程序的C++部分与QML对象进行交互。,c++,qt,user-interface,qml,qtquick2,C++,Qt,User Interface,Qml,Qtquick2,以下是我的简单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() } Rect

以下是我的简单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++文件(QtC造饰器自动生成):

#包括
#包括
int main(int argc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
qqmlaplicationengine;
发动机负荷(QUrl)(QStringletral(“qrc:///main.qml")));
返回app.exec();
}
我的问题是,我不知道如何访问我的“窗口”QML对象,因此,我无法更改其任何属性或其子对象的属性!QTQuice文档的这一部分显示了两种从C++代码中访问QML对象的方法,但它们都不适用于这个“QQML应用程序引擎”加载方案。我也见过人们使用诸如“QApplicationViewer”和“QDecrativeView”之类的东西,但我似乎在官方文档中根本找不到这些东西

我对QtQuick感到非常沮丧;QML的“简单性”似乎在C++和QML之间的冲突文档和复杂的界面中迷失了。在使用QQmlApplicationEngine方法时,我是否仍然可以访问我的QML对象?我尝试过使用“QuickView”,但它似乎对WindowQML对象不起作用。。?QQmlApplicationEngine是否仅对单个文件中的仅限QML的应用程序有用?到目前为止,我读过的每一篇文档和教程都显示了不同的内容


如有任何帮助或澄清,将不胜感激<理想的是,我想知道如何通过我的C++代码访问和修改QML对象(比如“主窗口”、“TestReCt”和其他文件中的其他对象)。<强> >/P> < P>将我的注释变成一个正确的答案:这通常是通过两种方法:

  • 如果使用
    QQuickView
    或直接使用
    qqqmlapplicationengine
    ,则通过视图获取QML场景的根对象

  • 对于根对象,可以省略下一步,但对于“qml对象”,通常需要设置,然后可以使用以下方法查找任何子对象:

C++侧
对于任何QML对象都可以类似地执行此操作。这里的键是“objectName”。你可以省略根对象,因为C++端直接得到根对象,但是既然你在问你的QML对象,我想你一般都想解决它。一旦您希望对任何QML对象(包括子对象)执行相同操作,则需要使用。

谢谢!看来这可能会奏效,我很快就会搞定的。有点后续,但是。。您认为我应该单独使用QQmlEngine而不是QQmlApplicationEngine派生类吗?那么QQuickView呢?我发现很难理解这些“上下文”(QQmlEngine、QQmlApplicationEngine、QQuickView等)背后的差异/原因。。我对OpenGL后端的硬件加速感兴趣,所以我不想忽视任何重要的东西。再次感谢拉兹洛的帮助@Katswordfish先生:对于这个简单的例子,我可能会使用qqquickview和QQmlEngine,是的。让我知道此解决方案是否适用于您。感谢分享此解决方案。如果您使用的是远程Qml,那么最好从以下信号访问根对象:
objectCreated(QObject*rootobject,QUrl url)
缺点是没有intellisense,是否有任何新方法可以将QObject作为具有适当intellisense的适当类型?但是“id”属性用于什么呢?官方文档:
#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();
}
#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();
}
import QtQuick 2.2
import QtQuick.Window 2.1

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