讓我們看看下面的測試應用程序: 的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個移動事件,應用程序最初創建時,一個,當我完成窗口的動作。我正在用Qt 4.8.1和XOrg 7.6進行測試。
要查看原始X事件
- 有測試應用程序的運行。
- 獲取測試應用程序的窗口ID。爲此,請在命令行
xwininfo -name WINDOW_NAME
中執行,其中WINDOW_NAME
是測試應用程序窗口的名稱。另一種選擇是使用不帶參數的xwininfo,然後你必須用鼠標指針選擇測試應用程序窗口。
- 運行X事件監視器
xev -id 0x2a00002
,其中0x2a00002
是窗口ID在前面的步驟中發現。這將打印您的窗口從X服務器接收的X事件。 ConfigureNotify
是與QMoveEvent
對應的X協議。
您應該也可以考慮用戶使用鍵盤移動窗口的情況。 (至少在Windows中這是可能的,我不知道X11。) – 2012-10-18 14:55:50
QMoveEvent每次移動時都會發布,無論移動的方式如何。但是,有QResizeEvent,這也可能影響窗口中的動畫。 – divanov