QT快速应用程序窗口嵌入了C ++对象

时间:2014-10-13 13:22:24

标签: c++ qt qtquick2

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

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

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

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

的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
   }
}

由于

1 个答案:

答案 0 :(得分:3)

这取决于你的目的。如果你想要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对象。