Qt控件點(diǎn)擊消息獲取的方法詳解
今日為大家分享一個(gè)小功能實(shí)現(xiàn):如何獲取控件點(diǎn)擊響應(yīng)。
在這里,我以兩個(gè)最簡單并且具有代表性的控件來進(jìn)行功能講解。
舉例控件:QLabel、QPushButton
對(duì)于這兩個(gè)控件大家應(yīng)該都不會(huì)陌生了,做界面開發(fā)經(jīng)常會(huì)用到的。
開發(fā)環(huán)境:VS2017 + Qt5.14.2
首先來講如何獲取點(diǎn)擊控件響應(yīng),QPushButton自身就帶有了clicked消息,直接實(shí)現(xiàn)響應(yīng)消息就可以了。
除此之外,還有其他方式可以響應(yīng)該控件嗎?對(duì)此,我將QPushButton響應(yīng)鼠標(biāo)按下的消息做一個(gè)整理。
1.QPushButton響應(yīng)鼠標(biāo)點(diǎn)擊消息
1.1自身響應(yīng)消息clicked
最簡單的莫過于QPushButton自身的clicked消息。
創(chuàng)建響應(yīng)槽函數(shù)
connect(ui.btn1, QPushButton::clicked, this, &QMyWidget::OnBnClicked1);
實(shí)現(xiàn)按鈕響應(yīng)消息
void QMyWidget::OnBnClicekd1() { //響應(yīng)控件,做具體的響應(yīng)消息處理 }
1.2事件過濾器響應(yīng)消息
在Qbject中有這么一個(gè)函數(shù):eventFilter
建立事件過濾器。
virtual bool eventFilter(QObject * watched, QEvent * event)override;
想要獲取哪個(gè)控件的消息只需要監(jiān)視該控件就可以了。
控件監(jiān)視:ui.btn1->installEventFilter(this);
對(duì)該控件實(shí)施監(jiān)視后,該如何處理呢?
首先,需要判斷操作對(duì)象是否為QPushButton控件?除此之外全部過濾掉
if(watched == ui.btn1) { //是QPushButton過濾事件 } else { //不是QPushButton事件,忽略處理 }
其次,截獲出鼠標(biāo)按下消息
if(event->type() == QEvent::MouseButtonPress) { //鼠標(biāo)按下消息 }
到這里,為了驗(yàn)證正確性,可以用輸出日志的方式。發(fā)現(xiàn),果然可以響應(yīng)按鈕控件響應(yīng)。
但是,還有一些小瑕疵,測試發(fā)現(xiàn),無論是左鍵點(diǎn)擊鼠標(biāo)、右鍵點(diǎn)擊鼠標(biāo)或者是雙擊鼠標(biāo),都會(huì)觸發(fā)該消息,這就需要我們做進(jìn)一步優(yōu)化了。
最后,篩選左鍵響應(yīng)消息
接收到鼠標(biāo)按下消息后,此刻可以將事件轉(zhuǎn)化成鼠標(biāo)事件,更進(jìn)一步判斷。
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); if (mouseEvent->button() & Qt::LeftButton) { QPoint pt = mouseEvent->pos(); qDebug() << QStringLiteral("<eventFilter>事件中,點(diǎn)擊鼠標(biāo)左鍵的位置 = ") << pt; }
寫到這里,在嘗試下發(fā)現(xiàn)鼠標(biāo)右鍵點(diǎn)擊消息不會(huì)觸發(fā)了。
但是,還存在一個(gè)小問題,當(dāng)鼠標(biāo)左鍵雙擊按鈕時(shí),依舊響應(yīng)該消息。這里,就需要對(duì)QPushButton做一下特殊處理了,我們后續(xù)再進(jìn)行詳細(xì)講解。
到這里,使用事件過濾器eventFilter處理按鈕響應(yīng)就算完成了。
1.3mousePressEvent事件獲取
使用mousePressEvent事件可以獲取到按鈕的響應(yīng)消息嗎?
答案是不可以的。
如果想要驗(yàn)證真理的小伙伴可以在mousePressEvent中輸出日志,會(huì)發(fā)現(xiàn),當(dāng)點(diǎn)擊按鈕控件時(shí),是不會(huì)觸發(fā)該消息的,只有在控件之外或者是靜態(tài)控件上才會(huì)響應(yīng)。
所以,使用mousePressEvent方法獲取是不可取的。
綜上所述,想要獲取具有響應(yīng)消息的控件(例如:QPushButton)點(diǎn)擊事件方法只有前兩種方式是可取的。
2.QLabel響應(yīng)鼠標(biāo)點(diǎn)擊消息
QLabel控件也可以說是靜態(tài)顯示控件,查看底層類可以發(fā)現(xiàn),該類不具備鼠標(biāo)響應(yīng)事件,那么對(duì)于這種控件該如何獲取點(diǎn)擊事件呢?
2.1事件過濾器響應(yīng)消息
與按鈕響應(yīng)事件獲取方法一致,通過監(jiān)視控件,截獲消息的方式實(shí)現(xiàn),這里就不再過多說明了。
2.2mousePressEvent事件獲取
QPushButton控件使用鼠標(biāo)按下響應(yīng)無法獲取消息,但是QLabel是可以的。
那么該如何獲取呢?
核心:獲取mousePressEvent中點(diǎn)的位置,將其轉(zhuǎn)換成控件位置,是否存在有效控件指針
QLabel *child = static_cast<QLabel*>(childAt(event->pos())); if (child) { //鼠標(biāo)點(diǎn)擊在QLabel控件上 } else { //鼠標(biāo)未點(diǎn)擊在控件上,忽略處理 }
到此,兩種具有代表性的控件響應(yīng)消息獲取方式已經(jīng)講解完成了,是不是很簡單?
以上就是Qt控件點(diǎn)擊消息獲取的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Qt控件點(diǎn)擊消息獲取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言實(shí)現(xiàn)刪除某一個(gè)數(shù)組值的方法
這篇文章主要給大家分享C語言數(shù)組中刪除數(shù)組中某個(gè)值的方法,既然要學(xué)習(xí)刪除數(shù)組中的元素,我們就必須得先知道數(shù)組中有哪些元素。同時(shí)還要定義一個(gè)變量,并將需要?jiǎng)h除的元素賦值給那個(gè)變量。下面來看看文章的詳細(xì)內(nèi)容吧2021-11-11C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例
這篇文章主要介紹了C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05C++實(shí)現(xiàn)LeetCode(118.楊輝三角)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(118.楊輝三角),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之棧&隊(duì)列&數(shù)組詳解
自考重點(diǎn)、期末考試必過指南,這篇文章讓你理解什么是棧、什么是隊(duì)列、什么是數(shù)組。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09C語言詳解實(shí)現(xiàn)鏈?zhǔn)蕉鏄涞谋闅v與相關(guān)接口
二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關(guān)系。通常的方法是鏈表中每個(gè)結(jié)點(diǎn)由三個(gè)域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結(jié)點(diǎn)左孩子和右孩子所在的鏈結(jié)點(diǎn)的存儲(chǔ)地址2022-04-04淺析C/C++ 中return *this和return this的區(qū)別
return *this返回的是當(dāng)前對(duì)象的克隆或者本身,return this返回當(dāng)前對(duì)象的地址,下面通過本文給大家介紹C/C++ 中return *this和return this的區(qū)別,感興趣的朋友一起看看吧2019-10-10