在Component.onCompleted之前初始化QML信号

时间:2017-07-03 20:34:10

标签: qt qml qt-signals

我有以下问题: 我写了一个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();

1 个答案:

答案 0 :(得分:2)

你做错了,而不是从C ++访问QML,你应该从QML访问C ++。

Qml_cpp_interface暴露给QML,因为暴露核心逻辑接口是有意义的。由于你正在进行初始化,你甚至不需要信号,因为大概你只需要初始化一次,这就意味着&#34;初始化&#34;。

然后你可以通过

简单地调用初始化

Component.onCompleted: Qml_cpp_interface.getInitDrone()

另外,我没有看到从QML初始化的任何正当理由,我的意思是你可以直接从C ++初始化,甚至隐含地从Qml_cpp_interface的构造函数初始化。因此,当GUI加载时,您已经初始化了。