【问题标题】:Qt - How to create widget asynchronously?Qt - 如何异步创建小部件?
【发布时间】:2012-10-25 00:14:00
【问题描述】:

我想异步创建一个小部件,然后将其分配给主线程中的对话框。我有一个创建小部件的功能:

shared_ptr<QTableWidget> createTable() {
    auto table = make_shared<QTableWidget>()

    // ... add some items to the table

    return table;
}

当我同步调用这个函数时,一切都按预期工作。问题是当我异步调用这个函数时:

auto futureWidget = QtConcurrent::run(createWidget);

我使用QFutureWatcher::finished() 信号,当小部件创建完成后,我尝试将该小部件添加到主/GUI 线程中的对话框中。

问题是,当我向表中添加项目时,有时它会与 SIGSEG 一起崩溃。有时,当它完成时,创建的小部件不会显示。在标准输出中也有很多关于在 GUI 线程外使用 pixmap 的警告。

这不可能在 Qt 的不同线程中创建小部件吗?如果可以,怎么做?

【问题讨论】:

  • 这个问题经常被问到。尝试使用关键字“qt thread gui”搜索 SO
  • 您最好在主线程中创建小部件并使用信号/插槽稍后填充它。更好——使用MVC

标签: c++ qt


【解决方案1】:

不,只能在主线程中创建 GUI 小部件。

通常,创建小部件的GUI 部分并不需要太多时间。如果你有一些操作,需要花费很多时间,你可能应该从小部件创建过程中提取它,在单独的线程中处理它,然后将此操作的结果传递给新创建的小部件。

编辑

如果小部件中有一些复杂的表格,则应使用Qt MVC系统,即QTableView和基于QAbstractTableModel的模型。然后您可以在另一个线程中填充模型,然后才将其分配给在主线程中创建的视图。

【讨论】:

  • 其实创建小部件需要很多时间。它是一张数千行数十列的表格。
  • 在这种情况下,您最好使用单独的模型和视图。在单独的线程上填充模型,并在准备好后将其设置在表格视图中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2011-05-15
  • 2013-12-21
相关资源
最近更新 更多