1

私は C++ で Qt の学習を開始し、イベント メカニズムがどのように機能するかを理解しようとしました。アプリケーション自体でどのように機能するか、QApplication がイベントを処理し、それらを処理してオブジェクト/ウィジェットに通知するためにそれらをキューに入れる方法を理解しています。

ただし、まだ未解決の質問がいくつかあります。

  1. QApplication 自体は、イベントについてウィンドウ システムからどのように通知されますか?
  2. ウィンドウシステムはウィジェットの内部命名をどのように認識して、ウィジェット「x」がクリックされたか、フォーカスされたかなどをQApplicationに伝えることができます.
  3. ウィンドウ システムがウィジェット名を認識していない場合、またはクリックされたウィジェット (またはその他の種類のイベント) への参照がない場合、QApplication はどのウィジェットに通知する必要があるかをどのように判断しますか。

よろしくお願いします。

4

2 に答える 2

2

X11では、Qtはイベントについてxlib(Qt4)またはXCB(Qt5)をポーリングします。xlibの場合、それはXNextEvent()関数と他の関連する関数になります。

http://www.x.org/archive/X11R7.5/doc/man/man3/XMaskEvent.3.html

「XNextEvent」のQtソースコードをgrepすると、それが使用されている場所を見つけることができます。たとえば、Qt4.8.4のソースでは次のようになります。

$ grep -r XNextEvent
tools / qvfb / x11keyfaker.cpp:XNextEvent(dpy、&event);
src / plugins / platform / xlib / qxlibscreen.cpp:XNextEvent(mDisplay-> nativeDisplay()、&event);
src / gui / kernel / qwidget_x11.cpp:XNextEvent(X11-> display、&ev);
src / gui / kernel / qguieventdispatcher_glib.cpp:XNextEvent(X11-> display、&event);
src / gui / kernel / qeventdispatcher_x11.cpp:XNextEvent(X11-> display、&event);
src / gui / kernel / qapplication_x11.cpp:XNextEvent(X11-> display、&nextEvent);

XCBには、xcb_wait_for_event()があります。

Qtがイベントを取得すると、ウィジェット階層を介してQMLにイベントをディスパッチし始めることができます。

もちろん、これはX11(UnixとLinuxを意味します)専用です。他のプラットフォームでは、アプリケーションにイベントを配信する方法が異なります。

于 2013-02-18T06:40:00.663 に答える
1

たとえば、Windows では、QWidget は、hwnd およびその他すべての関連するものを含む単純なウィンドウです。effectiveWinId() メソッドを呼び出して hwnd を取得することもできます。また、標準の Windows メッセージ ループを使用して、QCoreApplication::setEventFilter を介して適切なフィルターをインストールすることで、すべての Windows イベントについて通知を受け取ることができます。しかし、Qt には QML 部分やその他の非ネイティブなものもあり、それを機能させるために、「エイリアン ウィジェット」の性質に依存する内部簿記を使用します。

前述のすべてが非エイリアン ウィジェットに当てはまり、エイリアン ウィジェットは多少異なります。Alien ウィジェットは Qt 自体によって管理され、どの QWidget アクションを伝播する必要があるか、およびそのアクションが何であるかを識別するのは Qt の仕事です。Qt は 4.4 以降、デフォルトでエイリアン ウィジェットを使用していますが、必要に応じて簡単に無効にすることができます。

他の OS は実装が異なりますが、考え方は同じです。

于 2013-02-18T06:45:45.593 に答える