我知道这篇文章很老了,但我遇到了同样的问题。
我在Windows 7 64位上使用Qt 4.6,应用程序是使用Visual Studio 2008构建的。
我对QFileDialog
类有同样的用法。在我的一个小部件的插槽中,我尝试打开“浏览窗口”以选择要打开的文件。
我已经尝试了以下所有组合:
QFileDialog
实例与堆上的QFileDialog
实例。 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...
}
}
这在发布版本中完美无缺,但在调试版本中,结果如下:
所有版本(native / non-native,parent = this / parent = null) CRASH 。
所有版本(native / non-native,parent = this / parent = null) CRASH 。
事情是,当它崩溃时,它是一个非常难看的,调用堆栈完全搞砸了。它看起来像某种调试/非调试混合,但我已经仔细检查了QT_DEBUG的定义,并且我与Qt的调试库链接。
任何人都有线索?