我想异步创建一个小部件,然后将其分配给主线程中的对话框.我有一个函数来创建小部件:
shared_ptr<QTableWidget> createTable() {
auto table = make_shared<QTableWidget>()
// ... add some items to the table
return table;
}
Run Code Online (Sandbox Code Playgroud)
当我同步调用此函数时,一切都按预期工作.问题是当我异步调用此函数时:
auto futureWidget = QtConcurrent::run(createWidget);
Run Code Online (Sandbox Code Playgroud)
我使用QFutureWatcher::finished()信号,当小部件创建完成后,我尝试将该小部件添加到主/ GUI线程中的对话框.
问题是,当我向表中添加项目时,有时它只会与SIGSEG崩溃.有时,当它完成时,未显示创建的小部件.关于在GUI线程外部使用pixmap,标准输出上还有很多警告.
在Qt中不可能在不同的线程中创建小部件吗?如果有可能,该怎么办?
不,只能在主线程中创建GUI小部件.
通常,创建窗口小部件的GUI部分不需要太多时间.如果你有一些操作,这需要花费很多时间,你可能应该从创建小部件的过程中提取它,在单独的线程中处理它,然后将此操作的结果传递给新创建的小部件.
编辑
如果小部件中有一些复杂的表,则应使用Qt MVC系统,即QTableView基于的模型QAbstractTableModel.然后,您可以在另一个线程中填充模型,然后将其分配给在主线程中创建的视图.