文章目錄
- qt系統
- 事件
- 處理鼠標事件
- 鼠標移動事件
- 處理鍵盤事件
- 定時器事件
- 窗口移動和大小改變事件
- 結語
很高興和大家見面,給生活加點impetus!!開啟今天的編程之路!!
作者:?( ‘ω’ )?260
我的專欄:qt,Linux,C++進階,C++初階,數據結構初階,題海探驪,c語言
歡迎點贊,關注!!
qt系統
事件
事件是應用程序內部或者外部產生的事情或者動作的統稱。在qt中由QEvent該類來表示事件,同時,也衍生出了qt中常見的事件。
分別代表鼠標事件,鍵盤事件,定時器事件等等。
事件與信號槽的聯系:信號槽其實封裝了事件,比如qt中內置的信號,但是如果當內置的信號無法達到用戶想要的效果時,此時就必須使用事件來完成。
那我們需要如何處理事件呢?
一定是需要使用多態機制,這些事件在父類中都有對應的虛函數,我們所做的就是需要創建子類,在子類中對虛函數進行重寫
重寫需要滿足三同(函數名,參數類型和個數,返回值),我們可以取巧在qt助手中來搜索對應的函數。
我們來看例子:
處理鼠標事件
通過處理該事件,我們能夠完成鼠標進入和離開任何控件,并對應發出事件的操作。
我們先來講一點細節,這里使用label控件,實現當鼠標進入該控件的時候,實現對應的日志打印,同時,鼠標離開該控件的時候,也實現日志的打印。
為什么我這里使用label來實現呢?其實使用什么控件都是可以的,主要就是需要看范圍是什么,如果想鼠標進入離開事件并實現日志打印在Widget界面上的話,就需要對QWidget控件的子類進行該信號得重寫。
我們先給QLabel創建一個子類label:
隨后我們來完善一下子類的信息,我們需要完善一下構造函數,因為父類的構造函數有參數:
我們使用qt assistant來搜索enterEvent和leaveEvent,這樣保證函數不會寫錯,同時,我們對該虛函數在子類中完成重寫:
我們運行代碼,來看結果,發現日志并沒有打印,這個是怎么回事呢?答案其實在ui文件中,我們能夠發現,我們創建的label掛在對象樹上掛的是什么類型,是QLabel類型:
我們需要對其進行轉換,右鍵控件->提升為:
一定要保證提升類名稱和我們創建的子類名稱是相同的,否則仍然會出現問題(我們子類類型叫label)。
此時成功修改,這里還有一個細節,一定注意名字不要和類型起的沖突了,再來看結果:
使用鼠標點擊事件我們能夠獲得鼠標更多的詳細信息,比如鼠標的位置,鼠標的操作主要分為兩類,鼠標按下,鼠標松開,這兩個動作合成一起的話可以構成一個鼠標點擊,同理,也有鼠標雙擊的,直接來看代碼:
注意:此時我點擊的是控件左上角位置,此時坐標非常小,說明控件的原點坐標在左上角。
如果說我們使用globalX()函數,此時坐標就以顯示屏左上角為基準算的了:
我們Widget界面是800x600的,此時坐標都達到了875,足以說明此時坐標原點是顯示器左上角。
還有其他事件,而且Event中還能夠知道用戶按下了什么鍵,比如:左鍵,右鍵,來看代碼:
鼠標雙擊其實也是和上面單擊,按下,釋放一樣的,這里不再演示了。
鼠標移動事件
顧名思義,當鼠標發生移動的時候,該事件就會觸發。
來看代碼:
發現這樣寫,當Widget界面出來之后,我們在Widget界面上進行移動,發現并沒有日志打印出來,這個又是什么原因呢?
因為鼠標移動事件輕輕移動鼠標,就會產生大量的鼠標移動事件,就需要有大量的事件需要捕捉,無疑這會對程序造成效率降低,所以我們必須強制設置一下捕捉該信號:
當我們在Widget構造函數中添加上這一段話的時候,再來看結果:
處理鍵盤事件
在以前的學習中,其實我們已經接觸過鍵盤事件,只是我們不知道,其實QShortcut設置快捷鍵就是使用事件來完成的,就是使用qsequence這個類
這里我們可以通過鍵盤事件獲取單個按鍵,當然也可以獲取兩個按鍵,比如快捷鍵的方式。
我們這里新創建一個項目,因為創建的Widget本身就是繼承QWidget,上面例子只能夠在label范圍中使用,此時我們就能夠在整個Widget中使用了!!
此時打印日志成功顯示,這里還有一個細節,因為我們此時的可操作范圍是Widget,我們一定要選擇Widget界面之后,再來按下A鍵,日志才會打印,如果沒有選中,此時輸入A就是輸入法輸入的A。
接下來我們再來實現快捷鍵的形式,我們需要使用到modifirs這個類,來看代碼:
這里的效果和上面的一樣的,按下對應按鍵,出現日志信息。
定時器事件
定時器事件其實和我們之前學習了定時器類似,而且,定時器時間比控件形式還需要進行手動的管理timeId,還需要區分是哪個timeEvent發出的信號,所以,定時器事件更麻煩一些,推薦使用控件形式,我們直接來看代碼:
隨后其實就是一個10秒的倒計時器了,這個結果我們就不在演示了!
窗口移動和大小改變事件
通過窗口位置或者窗口大小的改變就會觸發該信號,我們直接來看代碼:
直接來看結果:
當我們每次移動或者縮放Widget窗口的時候,就會打印日志,你們應該是連續的打印,因為我的qt版本有點老。
結語
感謝大家的認真閱讀,不足之處歡迎留言指正,我們下期再見!