我有一个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
}
}
由于
答案 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对象。