use QGridLayout::addWidget with mutythread
use QGridLayout::addWidget with mutythread
由于创建小部件需要很多时间,因此我尝试在不同的线程中创建小部件并将其添加到主布局中,但这会失败。创建小部件然后顺序添加它们时,程序正常工作。我收到的通知:" qobject :: setParent:无法设置父,新父在其他线程中"有办法做到吗?
不,没有办法做到。
QT GUI类(包括QWidget
)必须仅从主线程中使用。引用QT文档:
尽管qobject是重新进入的,但GUI类,尤其是Qwidget和 它的所有子类都不是重新进入的。它们只能从 主线程。如前所述,qcoreapplication :: exec()也必须是 从该线程调用。
当您构造QWidget
时,Q_ASSERT_X
在QT代码中强制执行这一点:
Q_ASSERT_X(q->thread() == qApp->thread(), "QWidget",
"Widgets must be created in the GUI thread.");
因此,即使您会找到一些工作来使其正常工作,您也无法保证您的代码将以可重复的方式工作,并且任何QT更新都不会破坏您的代码。
关于您的特定问题,创建小部件不应耗时。我可以想到为什么要耗时的两个原因:
- 创建小部件时,您的小部件正在进行大量计算。然后,您将计算和仅计算放在另一个线程中。
- 您一镜头正在创建很多小部件。您可以使用事件循环来删除创建。基本上,您可以创建一些小部件,然后发布事件或设置将创建更多小部件的计时器等。直到您遇到某些停止条件为止。
相关文章:
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- specialized std::default_delete with QQmlComponent
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- Inference pytorch C++ with alexnet and cv::imread image
- Pybind11: init<> with lambda
- use QGridLayout::addWidget with mutythread