代码在尝试打开 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 时冻结的主要内容,如果未能解决你的问题,请参考以下文章