我有以下问题:
我写了一个qml-GUI和一个接口类,通过连接qml端的信号和c ++端的插槽来与一些C ++代码进行通信。基于事件或按钮的触发器工作正常,但我需要一个必须在启动时直接触发的信号。我使用Component.onCompleted
中的ApplicationWindow
进行了尝试。 Howevery,
输出" setInitDrone()调用"是生成但是 永远不会达到
getInitDrone()
。 QT文档说: "运行onCompleted处理程序的顺序未定义。"
我可以确保在我尝试发送信号时已经初始化了信号,还是有其他方法而不是使用Component.onCompleted?
谢谢你的帮助!
main.qml:
ApplicationWindow{
id: appWindow
visible: true
minimumHeight: 800
minimumWidth: 700
visibility: Window.Maximized
signal setInitDrone()
Component.onCompleted: {
setInitDrone()
print("setInitDrone() called")
}
}
qml_cpp_interface.cpp:
void Qml_cpp_interface::getInitDrone(){
qDebug() << "Cpp initDrone received";
flightserver.init();
}
groundstation.cpp:
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
//Connect with C++ code
QObject *item = engine.rootObjects().first();
Qml_cpp_interface qml_cpp_interface;
QObject::connect(item, SIGNAL(setInitDrone()), &qml_cpp_interface,SLOT(getInitDrone()));
return app.exec();
答案 0 :(得分:2)
你做错了,而不是从C ++访问QML,你应该从QML访问C ++。
将Qml_cpp_interface
暴露给QML,因为暴露核心逻辑接口是有意义的。由于你正在进行初始化,你甚至不需要信号,因为大概你只需要初始化一次,这就意味着&#34;初始化&#34;。
然后你可以通过
简单地调用初始化 Component.onCompleted: Qml_cpp_interface.getInitDrone()
另外,我没有看到从QML初始化的任何正当理由,我的意思是你可以直接从C ++初始化,甚至隐含地从Qml_cpp_interface
的构造函数初始化。因此,当GUI加载时,您已经初始化了。