QT Quick Application Window 嵌入 C++ 对象

Posted

技术标签:

【中文标题】QT Quick Application Window 嵌入 C++ 对象【英文标题】:QT Quick Application Window embed C++ object 【发布时间】:2014-10-13 13:22:23 【问题描述】:

我有一个 QT Quick 2.2 ApplicationWindow,我想在这个 ApplicationWindow 中使用一个 C++ 对象。

我知道QQuickView 视图,但这仅适用于派生自QQuickItem 的对象(不适用于ApplicationWindow)。

我也知道qmlRegisterType,但这只会在 QML 中添加一个通用的 C++ 类。我只想在ApplicationWindow 中有一个 C++ 对象(在 C++ 代码中实例化)。

是否有可能在 QT Quick 2.2 ApplicationWindow 中使用 C++ 对象?

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>
#include "myclass.h"

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    MyClass myClass;

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();

myclass.h

#include <QObject>
#include <QString>

class MyClass  : public QObject

    Q_OBJECT
public:
    MyClass(QObject *parent = 0) ;
    Q_INVOKABLE QString getValue();
;

myclass.cpp

#include "myclass.h"
#include <QString>

QString MyClass::getValue() 
    return "42";

qrc:///main.qml

import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow 
    visible: true

    Text 
        text: myClass.getValue()
        anchors.centerIn: parent
   

谢谢

【问题讨论】:

了解qmlRegisterType 另外:qt-project.org/doc/qt-5/qtqml-cppintegration-topic.html 这个问题在这里已经讨论过很多次了,虽然我找不到一个类似的会被认为是重复的...... 根据您的更新,您可以在我的回答中选择我的第二个解决方案。 【参考方案1】:

这取决于你的目的。如果你想define QML type from C++,,你应该在你的 main.cpp 中这样做:

qmlRegisterType< MyClass >("com.example.myclass", 1, 0, "MyClass");

现在在您的 .qml 文件中,首先您需要使用 import 语句导入新创建的数据类型:

import com.example.myclass 1.0

然后你可以从你自己的数据类型创建一个项目:

import QtQuick 2.2
import QtQuick.Controls 1.1
import com.example.myclass 1.0

ApplicationWindow 
    visible: true

    Text 
        text: myClass.getValue()
        anchors.centerIn: parent
   
    MyClass 

   


但是你有另一个解决方案。您可以将 QObject 对象从 c++ 传递到 QML。

QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("myClass", new MyClass);
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

现在您可以在 qml 文件中访问 myClass 对象。

【讨论】:

你的第二个解决方案就是我想要的。这次真是万分感谢。但是我还有一个小问题,我进入控制台'ReferenceError:myClass is not defined'。 setContextProperty 必须在 engine.load 之前 @saeed 你能改变你的解决方案 engine.load... 和 engine.rootContext... ,如果有人有同样的问题。感谢您的帮助。 @user3734670 之前做过 :)

以上是关于QT Quick Application Window 嵌入 C++ 对象的主要内容,如果未能解决你的问题,请参考以下文章

QT Quick Application Window 嵌入 C++ 对象

3 秒后所有 QT Quick Application 崩溃

从全屏 Qt Quick Application 内部截取屏幕截图

无法运行默认的 Qt Quick Application StackView 模板:“下级停止,因为它触发了异常”

qml 和 c++ 与 qt quick 2 应用程序

Qt Quick 2 应用程序中的非本机对话框