为什么 std::thread 无法打开 QT 对话框?

Why std::thread can't open a QT Dialog?

我想在 std::thread 中打开一个简单的 QT 对话框,但是在对话框打开成功后它崩溃了。

std::thread([&](){
    DialogWarning* dlg=new DialogWarning();
    dlg->setModal(true);
    dlg->exec();
    delete dlg;
}).detach();

这段代码有什么问题?

UI 组件只能从主线程(又名 GUI 线程)打开。

来自Threading basics | Qt 5.13

The Qt GUI must run in this [the main] thread. All widgets and several related classes, for example QPixmap, don't work in secondary threads.

无法在不同线程中打开对话框的主要原因已被@MarkoPacak 正确提及。

但是,解决此问题的方法是 emit 线程中的信号被主线程中的 slot 捕获。然后,在您的插槽中,您可以显示对话框。