调试版本中QFileDialog的崩溃/错误

时间:2013-05-02 12:41:01

标签: qt visual-c++ qfiledialog

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

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

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

我已经尝试了以下所有组合:

  • 堆栈上的本地vs. QFileDialog实例与堆上的QFileDialog实例。
  • “parent”参数设置为NULL vs.此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...
        }
    }
    

这在发布版本中完美无缺,但在调试版本中,结果如下:

堆分配对话框

所有版本(native / non-native,parent = this / parent = null) CRASH

堆栈分配对话框

所有版本(native / non-native,parent = this / parent = null) CRASH

静态助手

  • native,以父项为准:getOpenFileName返回空字符串而不显示任何内容
  • 原生,以父母为准: CRASH

事情是,当它崩溃时,它是一个非常难看的,调用堆栈完全搞砸了。它看起来像某种调试/非调试混合,但我已经仔细检查了QT_DEBUG的定义,并且我与Qt的调试库链接。

任何人都有线索?

0 个答案:

没有答案