qiushangren的專欄
使用版本qt5.11
檢視事件傳遞過程最簡單的方式就是將傳遞過程打印出來。操作如下:(很簡單的程式碼可以自己建立最簡工程然後按如下方式新增進去)
給application 安裝eventfilter後,看了下qt的事件 傳遞過程。如下一個按鍵一個按鍵事件的處理。
bool eventFilter(QObject *watched, QEvent *event)
{
if(event->type()== QEvent::KeyPress)
{
qDebug() << watched->objectName()<<" "<<watched->metaObject()->className()<<" "<<event->type();
QObject *ptr = m_watched->parent();
if(watched->parent())
{
qDebug()<<"have parent";
if( watched->parent()==m_watched)
qDebug()<<"getted watched";
}
}
return QObject::eventFilter(watched,event);
}
如果在eventfilter 中對event處理後不返回false,事件會從繼續傳遞,首先到接收事件的物件,再給其父物件,逐層遞迴。正常的所有的事件都能在父物件中通過過載的各種事件處理介面獲取到事件,如 keypressevent(QKeyEvent *event) ,mouseMoveEvent(QMouse*event);。
從上面圈出的地方可以看出,qt所有的窗體有一個 隱藏的父窗體物件,該物件用於向程式中其他物件分發事件。