在 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 信号的主要内容,如果未能解决你的问题,请参考以下文章

QML 文件中有很多项目的 Component.onCompleted 的顺序是啥?

如何将C ++类设置为qml中的Item?

ChartView没有显示BarSets数据

qml js

QML:Lambda 函数意外工作

在 QML 中更新对 var 属性的绑定