2012-10-24 45 views
0

我想异步创建一个小部件,然后将其分配给主线程中的一个对话框。我有一个函数来创建窗口部件:Qt - 如何异步创建窗口小部件?

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的不同线程中创建窗口小部件吗?如果有可能,怎么做?

+0

这经常被问到。尝试使用关键字“qt thread gui”搜索SO – 2012-10-24 14:42:18

+0

您最好在主线程中创建小部件,并稍后使用信号/插槽填充它。更好 - 使用[MVC](http://qt-project.org/doc/qt-4.8/model-view-programming.html)。 – elmigranto

回答

5

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

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

编辑

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

+0

实际上,创建小部件需要很长时间。这是一张有数千行和数十列的表格。 –

+0

在这种情况下,您最好使用单独的模型和视图。在单独的线程上填充模型,并在准备好时将其设置在桌面视图上。 –

+0

@JurajBlaho,看我的编辑 – Lol4t0

相关问题