最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

今日為大家分享一個(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)文章

最新評(píng)論

哈巴河县| 崇明县| 陆良县| 新巴尔虎右旗| 明溪县| 凭祥市| 新丰县| 科技| 确山县| 梁山县| 巴里| 长沙市| 榆中县| 高平市| 东至县| 彭泽县| 通州市| 潍坊市| 新营市| 神池县| 新巴尔虎左旗| 阿克陶县| 绥棱县| 台东县| 孟村| 白银市| 敖汉旗| 左权县| 南开区| 奎屯市| 银川市| 伊川县| 伊金霍洛旗| 于田县| 湟中县| 息烽县| 安阳县| 紫阳县| 化州市| 北辰区| 南安市|