我知道这篇文章很老了,但我遇到了同样的问题。
我在 Windows 7 64 位上使用 Qt 4.6,应用程序是使用 Visual Studio 2008 构建的。
我对这个类有同样的使用QFileDialog
。在我的一个小部件的插槽中,我尝试打开一个“浏览窗口”来选择要打开的文件。
我尝试了以下所有组合:
- 本机与
QFileDialog
堆栈上的QFileDialog
实例与堆上的实例。 - “父”参数设置为 NULL vs. this vs. mainWindow
QFileDialog::DontUseNativeDialog
设置为true
或false
const int cFILE_OPEN_DLG_TYPE = 0; #define FILE_OPEN_DLG_PARENT NULL //#define FILE_OPEN_DLG_PARENT this //#define FILE_OPEN_DLG_PARENT mMainWindow const bool cFILE_OPEN_DLG_NATIVE = false; void VgQtModelWidget::on_mBrowseButton_clicked() { QString lFilePath; QFileDialog::Options lOptions = (cFILE_OPEN_DLG_NATIVE ? QFileDialog::DontUseNativeDialog : 0); if (cFILE_OPEN_DLG_TYPE == 0) // Heap allocated dialog { QFileDialog* lFileDlg = new QFileDialog (FILE_OPEN_DLG_PARENT); lFileDlg->setOptions(lOptions); lFileDlg->setWindowTitle(tr("Open model")); lFileDlg->setFilter(tr("Model file (*.vsg4)")); if (!lFileDlg->exec() || !lFileDlg->selectedFiles().size()) { delete lFileDlg; return; } lFilePath = lFileDlg->selectedFiles().at(0); delete lFileDlg; } else if (cFILE_OPEN_DLG_TYPE == 1) // Stack allocated version { QFileDialog lFileDlg (FILE_OPEN_DLG_PARENT); lFileDlg.setOptions(lOptions); lFileDlg.setWindowTitle(tr("Open model")); lFileDlg.setFilter(tr("Model file (*.vsg4)")); if (!lFileDlg.exec() || !lFileDlg.selectedFiles().size()) { return; } lFilePath = lFileDlg.selectedFiles().at(0); } else { lFilePath = QFileDialog::getOpenFileName(FILE_OPEN_DLG_PARENT,tr("Open Model File"), tr("."), tr("Model file (*.vsg4)"), 0, lOptions); } QFile lFile (lFilePath); if (lFile.exists()) { // do something with file... } }
这在发布版本中完美无缺,但在调试版本中,结果如下:
堆分配对话框
所有版本(本机/非本机,parent=this/parent=null) CRASH。
堆栈分配对话框
所有版本(本机/非本机,parent=this/parent=null) CRASH。
静态助手
- 本机,无论哪个父级:getOpenFileName 返回一个空字符串而不显示任何内容
- 本地人,无论哪个父母:CRASH
问题是,当它崩溃时,它真的很丑陋,调用堆栈完全搞砸了。它确实看起来像是某种调试/非调试混合,但我已经仔细检查了 QT_DEBUG 是否已定义,并且我与 Qt 的调试库链接。
有人有线索吗?