1 つの Qt ダイアログの初期化が 1 つの QLineEdit のプライベート データへのポインタを返した後、0 に設定されます。ダイアログの生成された setupUi() 内にある間、ポインタはまだ有効です。その後、この特定の QLineEdit の構造が壊れているようです。
デバッガー内で実行している場合とデバッガーなしで実行している場合の両方で、アプリケーションがクラッシュします。
シングルスレッド アプリケーション。
QtCreator 2.7.0。
CMake プロジェクト。
MinGW 20120426 と g++ 4.6.2 (32 ビット アプリケーション):
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.2 (GCC)
ウィンドウズ7 64ビット。
'Locals and Expressions' の下部に表示されている他の QLineEdit 'kundenbestellcodeLineEdit' は正常に見えます。
Q: 誰かがこれを経験したことがありますか? また、なぜこれが起こるのか知っていますか?
正常に動作する他のダイアログを備えたユースケースが他にもいくつかありますが、なぜこの 1 つだけが問題を引き起こすのでしょうか?
g++ 4.7.2 を使用した Linux Debian Wheezy のリリース ビルドでこれを再現できます。
新しい情報: 'Dialog_Auswahl_des_Geraetemodells' という同じ名前の 2 番目の QDialog が、別のユースケース ディレクトリ (ファイル システム) と別の名前空間に存在します。この 2 番目のダイアログをリンク フェーズから削除すると、クラッシュは発生しません。
詳細情報: 2 番目のダイアログ クラスの名前を変更すると、クラッシュは発生しなくなります。ダイアログ オブジェクト ファイル (Dialog_ .o、moc_Dialog_ .o) が期待されるシンボルを提供することを確認するために、リンカー シンボルを確認しました。また、ユースケース パスが moc_*.cxx ファイル内に表示されることも確認しました。
この問題は実行時にのみ発生するため、Qt オブジェクト システムに、異なるフォルダー/名前空間内の同じ名前のクラスに関する問題があると想定する必要があります。
すでに述べたように、回避策は、これらのクラスのいずれかの名前を変更することです。