在 Component.onCompleted 之前初始化 QML 信号
Posted
技术标签:
【中文标题】在 Component.onCompleted 之前初始化 QML 信号【英文标题】:Initialize QML-signal before Component.onCompleted 【发布时间】:2017-07-03 20:34:10 【问题描述】:我有以下问题:
我编写了一个 qml-GUI 和一个接口类,通过将 qml 端的信号与 C++ 端的插槽连接起来,与一些 C++ 代码进行通信。基于事件或按钮的触发器工作正常,但我需要一个必须在启动时直接触发的信号。我尝试使用我的ApplicationWindow
中的Component.onCompleted
。不过,
生成了输出“setInitDrone() called”,但是
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();
【问题讨论】:
【参考方案1】:你做错了,而不是从 C++ 访问 QML 的东西,你应该从 QML 访问 C++。
将Qml_cpp_interface
公开给 QML,因为公开核心逻辑接口是有意义的。既然你在做初始化,你甚至不需要一个信号,因为大概你只会初始化一次,这就是“初始化”的意思。
然后你可以简单地调用初始化通过
Component.onCompleted: Qml_cpp_interface.getInitDrone()
另外,我没有看到任何从 QML 初始化的正当理由,我的意思是您可以直接从 C++ 初始化,甚至可以从 Qml_cpp_interface
的构造函数中隐式初始化。所以当你的 GUI 加载时,你已经初始化了。
【讨论】:
以上是关于在 Component.onCompleted 之前初始化 QML 信号的主要内容,如果未能解决你的问题,请参考以下文章