2

我知道这篇文章很老了,但我遇到了同样的问题。

我在 Windows 7 64 位上使用 Qt 4.6,应用程序是使用 Visual Studio 2008 构建的。

我对这个类有同样的使用QFileDialog。在我的一个小部件的插槽中,我尝试打开一个“浏览窗口”来选择要打开的文件。

我尝试了以下所有组合:

  • 本机与QFileDialog堆栈上的QFileDialog实例与堆上的实例。
  • “父”参数设置为 NULL vs. this vs. mainWindow
  • QFileDialog::DontUseNativeDialog设置为truefalse

    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 的调试库链接。

有人有线索吗?

4

0 回答 0