在Component.on完成之前初始化QML信号

问题描述:

我有以下问题: 我编写了一个qml-GUI和一个接口类,通过在qml端连接C++端的插槽上的信号与一些C++代码进行通信。基于事件或按钮的触发器工作正常,但我需要一个信号,必须在启动时直接触发。我通过使用我的ApplicationWindow中的Component.onCompleted来尝试。 Howevery,产生在Component.on完成之前初始化QML信号

输出 “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(); 

你做错了,而不是访问QML来自C++的东西,你应该访问C++来自QML。

Qml_cpp_interface公开为QML,因为它将暴露核心逻辑接口。既然你正在做初始化,你甚至不需要信号,因为大概你只会初始化一次,这就是“初始化”的意思。

然后,你可以简单地通过

Component.onCompleted: Qml_cpp_interface.getInitDrone()

调用初始化另外,我看不出有任何正当理由从QML初始化,我的意思是你可以直接在C初始化++,甚至从Qml_cpp_interface含蓄“的构造函数。所以在GUI加载的时候,你已经初始化了。