欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt控件點(diǎn)擊消息獲取的方法詳解

 更新時(shí)間:2022年06月22日 09:59:22   作者:中國好公民st  
本文將利用Qt中的QLabel、QPushButton這兩個(gè)控件,為大家詳細(xì)介紹一下Qt控件點(diǎn)擊消息獲取的方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

今日為大家分享一個(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í)現(xiàn)刪除某一個(gè)數(shù)組值的方法

    這篇文章主要給大家分享C語言數(shù)組中刪除數(shù)組中某個(gè)值的方法,既然要學(xué)習(xí)刪除數(shù)組中的元素,我們就必須得先知道數(shù)組中有哪些元素。同時(shí)還要定義一個(gè)變量,并將需要?jiǎng)h除的元素賦值給那個(gè)變量。下面來看看文章的詳細(xì)內(nèi)容吧
    2021-11-11
  • C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例

    C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例

    這篇文章主要介紹了C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++實(shí)現(xiàn)LeetCode(118.楊輝三角)

    C++實(shí)現(xiàn)LeetCode(118.楊輝三角)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(118.楊輝三角),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++二叉樹的直徑與合并詳解

    C++二叉樹的直徑與合并詳解

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)二叉樹基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • 一文搞懂C++多態(tài)的用法

    一文搞懂C++多態(tài)的用法

    C++多態(tài)是在繼承的基礎(chǔ)上實(shí)現(xiàn)的,了解多態(tài)之前我們需要掌握一定的C++繼承的知識(shí),本文將介紹C++中多態(tài)的概念,構(gòu)成條件以及用法,感興趣的可以學(xué)習(xí)一下
    2022-04-04
  • C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之棧&隊(duì)列&數(shù)組詳解

    C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之棧&隊(duì)列&數(shù)組詳解

    自考重點(diǎn)、期末考試必過指南,這篇文章讓你理解什么是棧、什么是隊(duì)列、什么是數(shù)組。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-09-09
  • opencv如何識(shí)別圖片上帶顏色的圓

    opencv如何識(shí)別圖片上帶顏色的圓

    這篇文章主要為大家詳細(xì)介紹了opencv如何識(shí)別圖片上帶顏色的圓,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C語言詳解實(shí)現(xiàn)鏈?zhǔn)蕉鏄涞谋闅v與相關(guān)接口

    C語言詳解實(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++中運(yùn)算符重載詳解及其作用介紹

    C++中運(yùn)算符重載詳解及其作用介紹

    這篇文章主要介紹了C++中運(yùn)算符重載詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 淺析C/C++ 中return *this和return this的區(qū)別

    淺析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

最新評(píng)論