次のテスト アプリケーションを考えてみましょう: main.cpp
#include <QApplication>
#include "win.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Win w;
w.show();
return app.exec();
}
win.h:
#include <QWidget>
#include <QEvent>
#include <QMoveEvent>
#include <QDebug>
class Win : public QWidget
{
public:
Win(QWidget *parent = 0) : QWidget(parent) {
this->installEventFilter(this);
}
protected:
bool eventFilter(QObject *obj, QEvent *event) {
if (event->type() == QEvent::Move) {
QMoveEvent *moveEvent = static_cast<QMoveEvent*>(event);
qDebug() << "Move event:" << moveEvent->pos();
} else {
qDebug() << "Event type:" << event->type();
}
return QWidget::eventFilter(obj, event);
}
};
このアプリケーションは、イベント フィルタを自身にインストールし、受信したすべてのイベントを QMoveEvent 用の特別なフォーマットでコンソールに出力し、ログ内でそれを識別します。
典型的なログ:
Event type: 203
Event type: 75
Move event: QPoint(0,0)
Event type: 14
Event type: 17
Event type: 26
Event type: 74
Event type: 77
Move event: QPoint(66,52)
Event type: 12
Event type: 24
Event type: 99
Event type: 77
Event type: 12
Event type: 10
Event type: 11
Move event: QPoint(308,356)
Event type: 19
Event type: 25
Event type: 99
Event type: 18
Event type: 27
Event type: 77
ご覧のとおり、アプリケーションが最初に作成されたときの 2 つの移動イベントと、ウィンドウの移動が完了した後の 1 つの移動イベントがあります。私は Qt 4.8.1 と XOrg 7.6 でテストしていました。
生の X イベントを確認するには
- テスト アプリケーションを実行します。
- テスト アプリケーションのウィンドウ ID を取得します。これを行うには、コマンド ライン
xwininfo -name WINDOW_NAME
で実行します。ここWINDOW_NAME
で、 はテスト アプリケーションのウィンドウの名前です。もう 1 つのオプションは、パラメーターなしで xwininfo を使用することです。その場合、マウス ポインターでテスト アプリケーション ウィンドウを選択する必要があります。
- X event monitor
xev -id 0x2a00002
を実行します。ここで0x2a00002
、 は前の手順で見つかったウィンドウ ID です。これにより、ウィンドウが X サーバーから受け取る X イベントが出力されます。ConfigureNotify
の X プロトコルに相当するものですQMoveEvent
。