MFCアプリケーションからQtアプリケーションを起動しているときに、モーダルQtダイアログを表示するのに問題があります。具体的には、親をQWinWidgetインスタンスに設定すると、QProgressDialogインスタンスがMFCアプリケーション内に表示されません。これが私の問題です...
私のMFCアプリケーションは、DLLであるQtアプリケーションに大量のデータを転送する必要があります。QtアプリケーションのAPIには、QProgressDialogを使用して舞台裏で実装されるProgressDlgクラスが含まれています。このダイアログは、MFCアプリケーションが進行状況を更新できるように、Qtアプリケーションのイベントループを初期化する前に作成および更新する必要があります(QApplication :: exec()ヘルプには、モーダルウィジェットでこれが可能であると記載されています)。
基になるQProgressDialogの親を設定しなくても、進行状況バーは期待どおりに更新され、転送中もダイアログは応答し続けますが、MFCアプリケーションとの対話を続けることができます。
そこで、Qt / MFC移行フレームワークをインストールし、QProgressDialogの親をQWinWidgetに設定してみました。
void ProgressDlg::SetParent(HWND hParentWnd)
{
QWinWidget* w = new QWinWidget(hParentWnd);
m_impl->setParent(w);
}
(ここで、m_implはQProgressDialogから派生します。)
次に、MFC側に呼び出しコードを追加して、ダイアログを作成します。
HWND hWnd = FindWindow(NULL, "ABC");
if(hWnd)
{
ProgressDlg dlg;
dlg.SetParent(hWnd);
//...
dlg.SetValue(0);
//...
}
ただし、親を設定する際に、QProgressDialogは表示されなくなります。(シナリオをさらに複雑にするために、:: FindWindowを使用してウィンドウ名を渡してハンドルを取得しました。私のMFCアプリケーションは、実際にはサードパーティの実行可能ファイルへのプラグインDLLです。)
すべての助けに感謝します。ありがとう。