C++发出信号稍后在 QML 中调用
C++ emit signal is invoked later in QML
我有一个项目的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((函数之后接收到发射信号,因此"正在加载..."效果变得不可见。
可能是应用程序QML 部分中使用的controller
类的实例位于 GUI 线程中吗?在这种情况下,发生的情况如下:
- 在代码中,设置
status_
并发出status_changed
信号。这实际上将信号传递给QML,但是... - 控制不会返回到事件循环,而是直接调用您的
db_manager_.load_project()
方法,我猜这是阻塞。此方法返回后... - 将
status_
设置回空字符串,然后再次发出status_changed
。 - 从
controller::load_project
方法返回后,控制将返回到Qt事件循环,直到现在才呈现QML部分。
要更改此设置,请使用线程(通过 QThread(在不同于 GUI/QML 线程的线程中运行实际加载。
相关文章:
- 通过 id 访问 QML 插槽中的嵌套对象(从 c++ 调用)
- 如何从qml Keys.oPressed调用qt keyPressEvent(QKeyEvent*事件)
- C++发出信号稍后在 QML 中调用
- 如何调用从 QML 中C++创建的对象的方法?
- qml 未知方法返回类型:ArchiveFile*,即使调用了 qmlRegisterUncreatableType
- 从 QML 调用 QAbstractTableModel setData 方法
- Qt/QML:将 WebEngineView 放在 ListView 中并调用 loadHtml()
- 从C 调用QML方法
- 如何在对象创建时从 QML 调用任意C++函数?
- Qt 5.12从Qml调用C++时出现偶发性SIGSEGV
- 无法在 QML 列表视图中调用 Qt c++ 方法
- 如何从C 调用非参数QML函数
- 从C 插件中调用QML中的JS函数
- 从QML(Qt Quick应用程序)调用C++方法
- 从级联 QML 调用C++函数
- 跨线程从QML调用QObject函数
- 使用 QML 调用虚拟C++函数
- 在 Qt5 中,从 QML 调用公共 QObject 函数Q_INVOKABLE需要吗?
- 从QML调用需要QImage或QPixmap的slot
- 无法从 QQmlPropertyMap 子类中的 QML 调用槽或Q_INVOKABLE