C++发出信号稍后在 QML 中调用

C++ emit signal is invoked later in QML

本文关键字:QML 调用 信号 C++      更新时间:2023-10-16

我有一个项目的qml和c ++端,我正在通过Q_INVOKABLEQ_PROPERTY宏公开我的C++属性。我的问题是,即使我在C++中发出信号,qml 端也会在执行其他一些代码后受到影响。有人可以向我提出解决方案吗?

我有一个status_成员变量,并在我的标头中像这样公开它;

Q_PROPERTY(QString statusProp MEMBER status_ NOTIFY status_changed)

然后,在.cpp文件中,我有函数load_project;

QString controller::load_project(QString proj_name)
{
status_ = "Loading...";
emit status_changed();
clear_layers();
QString result = db_manager_.load_project(proj_name, engine_list_);
status_ = "";
emit status_changed();
return result;
}

上面,状态更改为"正在加载...",但是在db_manager.load_project((函数之后接收到发射信号,因此"正在加载..."效果变得不可见。

可能是应用程序QML 部分中使用的controller类的实例位于 GUI 线程中吗?在这种情况下,发生的情况如下:

  1. 在代码中,设置status_并发出status_changed信号。这实际上将信号传递给QML,但是...
  2. 控制不会返回到事件循环,而是直接调用您的db_manager_.load_project()方法,我猜这是阻塞。此方法返回后...
  3. status_设置回空字符串,然后再次发出status_changed
  4. controller::load_project方法返回后,控制将返回到Qt事件循环,直到现在才呈现QML部分。

要更改此设置,请使用线程(通过 QThread(在不同于 GUI/QML 线程的线程中运行实际加载。