1

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です。)

すべての助けに感謝します。ありがとう。

4

1 に答える 1

2

ガッチャ!この問題は、SetParent()の呼び出しが原因で発生しました。代わりに、QProgressDialogの前にQWinWidgetを作成し、QWinWidgetインスタンスをその親としてQProgressDialogのコンストラクターに渡す必要がありました。

ヘルプにあるように、QWidget :: setParentはウィンドウフラグをリセットするため、ダイアログはダイアログとして認識されなくなりました。

于 2010-12-22T18:53:34.377 に答える