0

QtWinMigrate ソリューションを使用して、サード パーティの Mfc アプリケーションに読み込まれたプラグイン dll からダイアログを表示しています。問題は次のとおりです。

Mfc アプリケーションのメイン ウィンドウを最小化し、再度元に戻すと、開いている Qt ダイアログがすべて失われます。実際に Qt ダイアログが破棄されていることがわかりました。つまり、デストラクタが呼び出されています。

デバッグを行ったところ、次のことがわかりました。

Mfc メイン ウィンドウを閉じると、Qt ダイアログに SW_PARENTCLOSING wparam パラメータを含む WM_SHOWWINDOW メッセージが表示されます。次に、QtWndProc が呼び出され、SW_PARENTCLOSING ケースの問題に対して QHideEvent が送信されます。

ファイル qapplication_win.cpp の QtWndProc() 関数内 2160 行目

case WM_SHOWWINDOW :

if(lparam==SW_PARENTCLOSING) {
   QHideEvent e;
   qt_sendSpontaneousEvent(widget,e);
   widget->hideChildren(true); ////////////////////

QWinWidget の eventFilter は、私のダイアログを削除する DefferedDelete を送信します。

QWinWidget.cpp の 280 行目

QWinWidget::eventFilter(OObject* o, QEvent* e){

    case QEvent::Hide: 

    if(w->testAtrribute(Qt::WA_DeleteOnClose)

    deleteLater(); 

}

誰かが私にこの振る舞いを説明してもらえますか? これは私にはバグのようです。

ありがとう

4

1 に答える 1

0

あなたの質問に答えがあります。WA_DeleteOnCloseに関するドキュメントを参照してください。非表示のときに削除したくないダイアログでsetAttribute(WA_DeleteOnClose, false)を呼び出す必要があります。

于 2010-03-06T12:57:03.403 に答える