gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:31:42 29 4
gpt4 key购买 nike

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

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

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. Control 不会返回到事件循环,而是您正在调用您的 db_manager_.load_project() 方法,我猜这是阻塞的。此方法返回后...
  3. 您将 status_ 设置回空字符串并再次发出 status_changed
  4. 一旦您从 controller::load_project 方法返回,控制权就会返回到 Qt 事件循环,现在只呈现 QML 部分。

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

关于稍后在 QML 中调用 C++ 发射信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51247911/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com