2

この投稿はかなり古いことは知っていますが、同じ種類の問題が発生しています。

Windows 7 64 ビットで Qt 4.6 を使用しています。アプリケーションは Visual Studio 2008 でビルドされています。

QFileDialog私はクラスの同じ種類の使用法を持っています。ウィジェットの 1 つのスロットで、開くファイルを選択するために「参照ウィンドウ」を開こうとしました。

次のすべての組み合わせを試しました。

  • QFileDialogスタック上のネイティブとQFileDialogインスタンス、ヒープ上のインスタンス。
  • NULL として設定された「parent」パラメーターと this と mainWindow
  • QFileDialog::DontUseNativeDialogtrueまたはに設定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 のデバッグ ライブラリとリンクしていることを再確認しました。

誰にも手がかりがありますか?

4

0 に答える 0