この投稿はかなり古いことは知っていますが、同じ種類の問題が発生しています。
Windows 7 64 ビットで Qt 4.6 を使用しています。アプリケーションは Visual Studio 2008 でビルドされています。
QFileDialog
私はクラスの同じ種類の使用法を持っています。ウィジェットの 1 つのスロットで、開くファイルを選択するために「参照ウィンドウ」を開こうとしました。
次のすべての組み合わせを試しました。
QFileDialog
スタック上のネイティブとQFileDialog
インスタンス、ヒープ上のインスタンス。- NULL として設定された「parent」パラメーターと this と 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 のデバッグ ライブラリとリンクしていることを再確認しました。
誰にも手がかりがありますか?