代码在尝试打开 QDialog 时冻结

Posted

技术标签:

【中文标题】代码在尝试打开 QDialog 时冻结【英文标题】:Code freezes on trying to open QDialog 【发布时间】:2015-08-13 08:43:04 【问题描述】:

我正在尝试在 MSVS2010 Professional 中调试 c++/Qt5.5 代码。一个函数有以下几行代码,

/* Static method approach */
QString filters("Music files (*.mp3);;Text files (*.txt);;All files (*.*)");
QString defaultFilter("Text files (*.txt)");

QFileDialog::getSaveFileName(0, "Save file", QDir::currentPath(), filters, &defaultFilter);

对话框根本打不开,应用程序冻结。

我尝试了以下替代方法。

/* Direct object construction approach */
    QFileDialog fileDialog(0, "Save file", QDir::currentPath(), filters);
    fileDialog.selectNameFilter(defaultFilter);
    fileDialog.exec();

但同样,代码在“fileDialog.exec()”处冻结。 所以,我只用这些语句创建了一个不同的新简单项目,它按预期工作。

这是我的环境配置的问题。我尝试调试,但在进入上述行时只会冻结代码而没有任何错误。

【问题讨论】:

当您为对话框提供有效的父级而不是 0 作为第一个参数时,是否也会发生这种情况? 是的,另一个观察结果是,如果我在主窗口初始化开始时复制粘贴相同的代码,它会按预期工作。但它在 mainWindow 方法中不起作用。 你能提供更多代码吗?我已经尝试了两个 sn-ps,它们都工作正常。 让这些 shell 对话框陷入死锁并不罕见。当显示它的线程不是 STA 线程时会发生这种情况。或者,如果您在机器上安装了行为不端的 shell 扩展。问题中没有任何内容可以提供线索,挂起的 UI 线程的堆栈跟踪是最低要求。 尝试将其更改为比您的自动存储持续时间更长的类成员。 exec() 搅乱事件队列的方式非常混乱。 【参考方案1】:

这看起来像是 Qt 中的一个已知问题。 https://forum.qt.io/topic/49209/qfiledialog-getopenfilename-hangs-in-windows-when-using-the-native-dialog/8

解决方法是使用 QFileDialog::DontUseNativeDialog 标志,如下所示。

m_imageFile = QFileDialog::getOpenFileName(this, tr("Open Image"), QDir::homePath(), tr("Image Files (*.png *.jpg *.bmp)"), 0, QFileDialog::DontUseNativeDialog); //works

感谢您的帮助!

【讨论】:

对我不起作用。 ***.com/questions/64531794/…。它仍然阻止其他 QThread 强制应用公然关闭,几乎没有警告为“QThread 被破坏”【参考方案2】:

我遇到了同样的问题,发现这可能是因为您的 UI 线程中的 COM 初始化错误。如果你有什么地方:

HRESULT hres = CoInitializeEx( 0, COINIT_MULTITHREADED );

必须替换为:

HRESULT hres = CoInitializeEx( 0, COINIT_APARTMENTTHREADED );

认为本机窗口可能正在使用 COM 调用,只是因为死锁而坐在这里。

【讨论】:

如何在 python 中做到这一点。我没有答案了***.com/questions/64531794/… @lone_coder 如果你没有在 python 中使用 COM,那么这不是问题

以上是关于代码在尝试打开 QDialog 时冻结的主要内容,如果未能解决你的问题,请参考以下文章

后续线程中的PyQt5 QDialog

在打开 qdialog 的情况下关闭 qmainwindow 时 Python 崩溃

显示 QDialog 时出现 QT Thread 问题

如何从 Python 中的 QDialog 实例返回值?

以非阻塞方式打开 QDialog

为啥我的输出在到达这部分代码时会冻结?