Qt 事件過濾器
@
分析
現在有這樣一個場景,介面中有三個按鈕,分別實現三個按鈕對應槽函數,正常情況下點擊是這樣的
現在來使用事件過濾的方式使按鈕2
的點擊失效
在此之前需要知道事件的傳遞流
以滑鼠點擊事件為例,當介面中產生一個滑鼠點擊事件,經過一系列亂七八糟的處理,事件來到Qt
的事件分發器
,事件分發器
一看是按鈕
的事件嘛,然後就把事件交給按鈕
處理,按鈕
一看”哦,事件來了啊,趕緊處理,拋個訊號完事”
整個事件的流程大致就是這樣
A(事件產生)–>B(…)–>C(Qt事件分發器)
C–>D(按鈕)–>H(處理)
那什麼時候用到事件過濾器呢?
試想上面的場景本來一切正常,突然有一天,按鈕
說”996太累了,widget
你能不能幫我干一部分活”,widget
也是個職場老油條了,心說幫你幹活可以,但是你得給我留個條,說」行,但是我怕我忘了,你給我寫個條吧(安裝事件過濾器)「
於是流程又變成了這樣
D–處理安裝了過濾器的控制項的事件–>E(事件過濾器)–>D
A(事件產生)–>B(…)–>C(Qt事件分發器)–>D(widget)–>F(按鈕)–>G(處理)
程式碼
一、控制項安裝事件過濾器
// 按鈕2先安裝事件過濾器,指定一個對象,事件產生後會先交給指定的對象處理
ui.btn2->installEventFilter(this);
二、在過濾器中實現事件過濾事件
事件進入到事件過濾器中,進行自己想要的處理,返回true
表示事件標記為處理完畢,那麼事件將不會繼續向下傳遞,返回false
則反之
最後如果自己不做處理的事件,別忘了交給父對象處理,
bool test::eventFilter(QObject *watched, QEvent *event)
{
if (ui.btn2 == watched)
{
if (QEvent::MouseButtonPress == event->type())
{
qDebug() << QStringLiteral("滑鼠按下事件,已攔截");
return true;
}
else if (QEvent::MouseButtonRelease == event->type())
{
qDebug() << QStringLiteral("滑鼠釋放事件,已攔截");
return true;
}
else if (QEvent::MouseButtonDblClick == event->type())
{
qDebug() << QStringLiteral("滑鼠雙擊事件,已攔截");
return true;
}
}
// 將事件交給父對象處理
return QWidget::eventFilter(watched, event);
}
效果
總結
說白了事件過濾器就是自己不想處理的事件,交給別人來處理
我不想上班,誰能幫我上啊