12

標準の Windows メッセージ ループの実装Qtに置き換えた場合、機能が失われますか? QApplication::exec()これは私が何を意味するかを明確にする必要があります:

イベント処理を実行する通常の「Qt」の方法:

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Window w;
 w.show();
 return a.exec();
}

イベント処理を実行する「Windows」の方法:

#include <Windows.h>

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Window w;
 w.show();

 MSG msg;
 while(GetMessage(&msg, 0, 0, 0)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
 }

 return msg.wParam;
}

上記は、インスタンスに関する外部メッセージ ループがあることを示していQApplicationますが、QApplicationインスタンス自体には独自のイベント ループさえありません。

言い換えれば、メッセージ ループとQt GUI およびインスタンスmain.exeを含むプログラム (Qt について何も知らない) がある場合、Qt GUI のイベントを処理するために外部メッセージ ループを許可しても問題ありませんか? 前もって感謝します!.dllQApplicationmain.exe

編集 1: 誰かにとって役に立つ場合に備えて、私は自分自身に答えます: イベント ループ処理を実行する .NET の下で C# で記述されたメインの .exe モジュールがあり、Qt/C++ で記述された .dll がいくつかあります。 「内部」の GUI (および共有される QApplication インスタンス)。QApplication::exec() は呼び出されませんが、すべてのイベントはメインの .exe (.NET) モジュールのイベント ループによって正常にディスパッチされ、すべての Qt 機能(シグナル/スロット、スレッドなど)が存在します。

編集 2: Qt 4.8.2 では機能しましたが、Qt 5.1.0 では少し異なります。QApplication ::processEvents() は最初の呼び出しで初期初期化を実行するため、一度呼び出す必要があります ( GetMessage または PeekMessage に WindowsHook をインストールします)。その後、アプリケーション Qt イベントで GetMessage を呼び出す人は誰でもプロセスを取得し、あなたはゴールデンです:)

4

1 に答える 1

1

私の頭に浮かぶ最初のことは、Qt イベント ループがそれらの呼び出しを実行しているため、スレッド間でスロットを呼び出すことは機能しないということです。

しかし、より重要な質問はおそらく次のとおりです。特に qeventdispatcher_win.cpp で本質的に同じことを行っているのに、なぜこのようにしたいのですか?

于 2013-05-14T13:44:52.327 に答える