日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Qt控件點擊消息獲取的方法詳解_C 語言

作者:中國好公民st ? 更新時間: 2022-08-14 編程語言

今日為大家分享一個小功能實現:如何獲取控件點擊響應。

在這里,我以兩個最簡單并且具有代表性的控件來進行功能講解。

舉例控件:QLabel、QPushButton

對于這兩個控件大家應該都不會陌生了,做界面開發經常會用到的。

開發環境:VS2017 + Qt5.14.2

首先來講如何獲取點擊控件響應,QPushButton自身就帶有了clicked消息,直接實現響應消息就可以了。

除此之外,還有其他方式可以響應該控件嗎?對此,我將QPushButton響應鼠標按下的消息做一個整理。

1.QPushButton響應鼠標點擊消息

1.1自身響應消息clicked

最簡單的莫過于QPushButton自身的clicked消息。

創建響應槽函數

connect(ui.btn1, QPushButton::clicked, this, &QMyWidget::OnBnClicked1);

實現按鈕響應消息

void QMyWidget::OnBnClicekd1()
{
    //響應控件,做具體的響應消息處理
}

1.2事件過濾器響應消息

在Qbject中有這么一個函數:eventFilter建立事件過濾器。

virtual bool eventFilter(QObject * watched, QEvent * event)override;

想要獲取哪個控件的消息只需要監視該控件就可以了。

控件監視:ui.btn1->installEventFilter(this);

對該控件實施監視后,該如何處理呢?

首先,需要判斷操作對象是否為QPushButton控件?除此之外全部過濾掉

if(watched == ui.btn1)
{
    //是QPushButton過濾事件
}
else
{
    //不是QPushButton事件,忽略處理
}

其次,截獲出鼠標按下消息

if(event->type() == QEvent::MouseButtonPress)
{
    //鼠標按下消息
}

到這里,為了驗證正確性,可以用輸出日志的方式。發現,果然可以響應按鈕控件響應。

但是,還有一些小瑕疵,測試發現,無論是左鍵點擊鼠標、右鍵點擊鼠標或者是雙擊鼠標,都會觸發該消息,這就需要我們做進一步優化了。

最后,篩選左鍵響應消息

接收到鼠標按下消息后,此刻可以將事件轉化成鼠標事件,更進一步判斷。

QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if (mouseEvent->button() & Qt::LeftButton)
{
	QPoint pt = mouseEvent->pos();
	qDebug() << QStringLiteral("<eventFilter>事件中,點擊鼠標左鍵的位置 = ") << pt;
}

寫到這里,在嘗試下發現鼠標右鍵點擊消息不會觸發了。

但是,還存在一個小問題,當鼠標左鍵雙擊按鈕時,依舊響應該消息。這里,就需要對QPushButton做一下特殊處理了,我們后續再進行詳細講解。

到這里,使用事件過濾器eventFilter處理按鈕響應就算完成了。

1.3mousePressEvent事件獲取

使用mousePressEvent事件可以獲取到按鈕的響應消息嗎?

答案是不可以的。

如果想要驗證真理的小伙伴可以在mousePressEvent中輸出日志,會發現,當點擊按鈕控件時,是不會觸發該消息的,只有在控件之外或者是靜態控件上才會響應。

所以,使用mousePressEvent方法獲取是不可取的。

綜上所述,想要獲取具有響應消息的控件(例如:QPushButton)點擊事件方法只有前兩種方式是可取的。

2.QLabel響應鼠標點擊消息

QLabel控件也可以說是靜態顯示控件,查看底層類可以發現,該類不具備鼠標響應事件,那么對于這種控件該如何獲取點擊事件呢?

2.1事件過濾器響應消息

與按鈕響應事件獲取方法一致,通過監視控件,截獲消息的方式實現,這里就不再過多說明了。

2.2mousePressEvent事件獲取

QPushButton控件使用鼠標按下響應無法獲取消息,但是QLabel是可以的。

那么該如何獲取呢?

核心:獲取mousePressEvent中點的位置,將其轉換成控件位置,是否存在有效控件指針

QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if (child)
{
   //鼠標點擊在QLabel控件上
}
else
{
    //鼠標未點擊在控件上,忽略處理
}

到此,兩種具有代表性的控件響應消息獲取方式已經講解完成了,是不是很簡單?

原文鏈接:https://juejin.cn/post/7111847663456223239

欄目分類
最近更新