##使用 setContextProperty,是将对象或数据暴露给 QML,一般默认就是全局单例。 函数原型
void QQmlContext::setContextProperty(const QString &name, QObject *value)
void QQmlContext::setContextProperty(const QString &name, const QVariant &value)
eg:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.rootContext( )->setContextProperty(
"Greeting",
QObject::tr( "Hello QML from C++" ) );//变量,qml中直接就可用此属性的值
engine.rootContext( )->setContextProperty(
"CPlusPlusClass",
new CPlusPlusClass() );//对象,此处new的时候创建对象了
//setContextProperty,在qml中是全局的
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
qml中就可以使用了
Window {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
Text {
id: text
text: Greeting //直接就可以使用了此属性了
anchors.centerIn: parent
}
Button {
anchors.top: text.bottom
text: "CPlusPlusClass.method()"
MouseArea {
anchors.fill: parent
onClicked: {
CPlusPlusClass.method()//调用类中的方法
}
}
}
// Greeting{// 不可以
// }
}
##使用qmlRegisterType 注册类型到qml中
函数原型
template<typename T>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
eg
// 1C++类类型到QML类型系统中,qml要访问类中的数据,需要把数据添加到qt元对象系统中去
qmlRegisterType<CPlusPlusClass>( //CPlusPlusClass c++类名
"CPlusPlus.Test", // 统一资源标识符
1, // 主版本
0, // 次版本
"CPlusPlusType" ); // QML类名称
//2导入类型
import CPlusPlus.Test 1.0 // 分别对应于 qmlRegisterType参数的:统一资源标识符 ,主次版本
//3qml中使用
CPlusPlusType {
//CPlusPlusType对应于qmlRegisterType参数的QML类名称
//注:在此处CPlusPlusType才实例化.
}
##使用qmlRegisterSingletonType() 注册单例类型到qml中(实例化实在c++中实例化的) 函数原型
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QJSValue(* ) ( QQmlEngine *, QJSEngine * ) callback)
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(* ) ( QQmlEngine *, QJSEngine * ) callback)
int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)