无法设置 QQmlApplicationEngine rootContext 属性
Unable to set QQmlApplicationEngine rootContext Property
我有以下代码,我认为应该使“后端”C++ 对象在我的 GUI 的 QML 元素中可用,但似乎失败了,导致我的 QML 对象 属性为空。
//Initialize the engine, register the Data_Client object and set the "client" property
QQmlApplicationEngine engine;
QQmlContext *context = engine.rootContext();
const QUrl url(QStringLiteral("qrc:/qml/gui.qml"));
qmlRegisterType<Data_Client>("uri", 1, 0, "Data_Client");
qmlRegisterType<StatusObject>("uri", 1, 0, "StatusObject");
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
Data_Client client();
//Make the Data_Client accessible in the engine root context so its available to all component instances
context->setContextProperty("client", &client);
return app.exec();
在gui.qml文件的ApplicationWindow
项中,声明了client
属性,声明了以“客户端”为目标的各种连接:
property Data_Client client
//...
Connections {
target: client
onNew_data:{
//...
}
在 Data_Client
C++ 中,我调用 emit new_data(QString("test"));
但从未触发 QML 中的处理程序。这以前是有效的,我认为从根本上来说很简单,所以我很高兴去,所以我还没有确定我可能坏了什么。我现在的操作理论是,这不是设置 rootContext 的 client
属性,但是我无法在运行时进行检查,是吗?有什么明显的我遗漏的吗?
理论上,setContextProperty 可以在任何时候调用,但是此时已经加载的任何 QML 文件可能都看不到那个新的 属性。在该点之后加载的 QML 文件将会看到它。因此,在调用 engine.load() 之前调用 setContextProperty 应该可以为您解决问题。
我有以下代码,我认为应该使“后端”C++ 对象在我的 GUI 的 QML 元素中可用,但似乎失败了,导致我的 QML 对象 属性为空。
//Initialize the engine, register the Data_Client object and set the "client" property
QQmlApplicationEngine engine;
QQmlContext *context = engine.rootContext();
const QUrl url(QStringLiteral("qrc:/qml/gui.qml"));
qmlRegisterType<Data_Client>("uri", 1, 0, "Data_Client");
qmlRegisterType<StatusObject>("uri", 1, 0, "StatusObject");
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
Data_Client client();
//Make the Data_Client accessible in the engine root context so its available to all component instances
context->setContextProperty("client", &client);
return app.exec();
在gui.qml文件的ApplicationWindow
项中,声明了client
属性,声明了以“客户端”为目标的各种连接:
property Data_Client client
//...
Connections {
target: client
onNew_data:{
//...
}
在 Data_Client
C++ 中,我调用 emit new_data(QString("test"));
但从未触发 QML 中的处理程序。这以前是有效的,我认为从根本上来说很简单,所以我很高兴去,所以我还没有确定我可能坏了什么。我现在的操作理论是,这不是设置 rootContext 的 client
属性,但是我无法在运行时进行检查,是吗?有什么明显的我遗漏的吗?
理论上,setContextProperty 可以在任何时候调用,但是此时已经加载的任何 QML 文件可能都看不到那个新的 属性。在该点之后加载的 QML 文件将会看到它。因此,在调用 engine.load() 之前调用 setContextProperty 应该可以为您解决问题。