我在项目的qml和c ++方面,我正在通过Q_INVOKABLE
和Q_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()函数之后接收到发射信号,因此“正在加载...”效果不可见。
答案 0 :(得分:2)
在您的应用程序的QML部分中使用的controller
类的实例是否存在于GUI线程中?在这种情况下,将发生以下情况:
status_
并发出status_changed
信号。实际上,这会将信号传递给QML,但是... db_manager_.load_project()
方法,该方法-我想是阻塞了。此方法返回后... status_
设置为空字符串,然后再次发出status_changed
。controller::load_project
方法返回后,控制权立即回到Qt事件循环,并且仅现在呈现QML部分。要更改此设置,请使用线程(通过QThread)在与GUI / QML线程不同的线程中运行实际加载。