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

时间:2018-07-09 14:28:00

标签: c++ qt qml

我在项目的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()函数之后接收到发射信号,因此“正在加载...”效果不可见。

1 个答案:

答案 0 :(得分:2)

在您的应用程序的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线程不同的线程中运行实际加载。