Qt控件點(diǎn)擊消息獲取的方法詳解
今日為大家分享一個(gè)小功能實(shí)現(xiàn):如何獲取控件點(diǎn)擊響應(yīng)。
在這里,我以兩個(gè)最簡(jiǎn)單并且具有代表性的控件來(lái)進(jìn)行功能講解。
舉例控件:QLabel、QPushButton
對(duì)于這兩個(gè)控件大家應(yīng)該都不會(huì)陌生了,做界面開發(fā)經(jīng)常會(huì)用到的。
開發(fā)環(huán)境:VS2017 + Qt5.14.2
首先來(lái)講如何獲取點(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
最簡(jiǎn)單的莫過(guò)于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事件過(guò)濾器響應(yīng)消息
在Qbject中有這么一個(gè)函數(shù):eventFilter建立事件過(guò)濾器。
virtual bool eventFilter(QObject * watched, QEvent * event)override;
想要獲取哪個(gè)控件的消息只需要監(jiān)視該控件就可以了。
控件監(jiān)視:ui.btn1->installEventFilter(this);
對(duì)該控件實(shí)施監(jiān)視后,該如何處理呢?
首先,需要判斷操作對(duì)象是否為QPushButton控件?除此之外全部過(guò)濾掉
if(watched == ui.btn1)
{
//是QPushButton過(guò)濾事件
}
else
{
//不是QPushButton事件,忽略處理
}
其次,截獲出鼠標(biāo)按下消息
if(event->type() == QEvent::MouseButtonPress)
{
//鼠標(biāo)按下消息
}
到這里,為了驗(yàn)證正確性,可以用輸出日志的方式。發(fā)現(xiàn),果然可以響應(yīng)按鈕控件響應(yīng)。
但是,還有一些小瑕疵,測(cè)試發(fā)現(xiàn),無(wú)論是左鍵點(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è)小問(wèn)題,當(dāng)鼠標(biāo)左鍵雙擊按鈕時(shí),依舊響應(yīng)該消息。這里,就需要對(duì)QPushButton做一下特殊處理了,我們后續(xù)再進(jìn)行詳細(xì)講解。
到這里,使用事件過(guò)濾器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控件也可以說(shuō)是靜態(tài)顯示控件,查看底層類可以發(fā)現(xiàn),該類不具備鼠標(biāo)響應(yīng)事件,那么對(duì)于這種控件該如何獲取點(diǎn)擊事件呢?
2.1事件過(guò)濾器響應(yīng)消息
與按鈕響應(yīng)事件獲取方法一致,通過(guò)監(jiān)視控件,截獲消息的方式實(shí)現(xiàn),這里就不再過(guò)多說(shuō)明了。
2.2mousePressEvent事件獲取
QPushButton控件使用鼠標(biāo)按下響應(yīng)無(wú)法獲取消息,但是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)講解完成了,是不是很簡(jiǎn)單?
以上就是Qt控件點(diǎn)擊消息獲取的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Qt控件點(diǎn)擊消息獲取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)繪制LoveBeat愛(ài)心曲線的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何溧陽(yáng)C語(yǔ)言實(shí)現(xiàn)繪制LoveBeat愛(ài)心曲線,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
純c實(shí)現(xiàn)異常捕獲try-catch組件教程示例
這篇文章主要為大家介紹了純c實(shí)現(xiàn)異常捕獲try-catch組件教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析二叉樹的操作
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-04-04
C語(yǔ)言中查詢進(jìn)程信號(hào)是否被遮罩或擱置的簡(jiǎn)單方法
這篇文章主要介紹了C語(yǔ)言中查詢進(jìn)程信號(hào)是否被遮罩或擱置的簡(jiǎn)單方法,包括sigprocmask函數(shù)和sigpending函數(shù)的簡(jiǎn)介,需要的朋友可以參考下2015-09-09
C語(yǔ)言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn),包括雙向劃分快速排序方法的介紹,需要的朋友可以參考下2015-11-11
VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例
這篇文章主要介紹了VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下2014-08-08

