網站首頁 編程語言 正文
今日為大家分享一個小功能實現:如何獲取控件點擊響應。
在這里,我以兩個最簡單并且具有代表性的控件來進行功能講解。
舉例控件: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
相關推薦
- 2022-12-06 Pycharm配置anaconda環境圖文教程_python
- 2022-03-16 Quartz.Net使用方法詳解_C#教程
- 2022-09-01 Docker鏡像的遷移與備份及Dockerflie?使用方法詳解_docker
- 2022-07-19 Docker容器內存占用過高解決方法
- 2022-05-17 基于Pytorch的神經網絡之Regression的實現_python
- 2022-08-15 Kotlin+buildSrc更好的管理Gradle依賴譯文_Android
- 2023-03-22 GoLang?string類型深入分析_Golang
- 2021-12-10 linux防火墻配置(基于yum倉的配置)詳細步驟_Linux
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支