PyQt5番外篇(3):你難道不愛我嗎???(2018情人節特刊)
小編一進辦公室,辦公室中所有人便都看著他笑,有的叫道,「今年的情人節你又單了啊!」他不回答,拿起手機說,「寶貝吃飯沒?」便甩出一副早已脫單的樣子。他們又故意的高聲嚷道,「你會有女朋友?」小編睜大眼睛說,「你怎麼這樣憑空污人清白,我早就有了……」「什麼清白?我前天親眼見你周末一人加班到很晚,點的外賣,有女朋友誰來加班啊。」小編便漲紅了臉,額上的青筋條條綻出,爭辯道,「有女朋友的事,需要給你說嗎?」接連便是難懂的話,什麼「我已經換成情頭」,什麼「我從不租女友」、「不買充氣娃娃」之類,引得眾人都鬨笑起來,辦公室中充滿了快活的空氣。
——記仍在單身的你
好吧,上面就是一個段子,千萬不要怪我2018情人節在你的寂寞心靈上踹上一腳。
沒有女朋友沒關係,有我啊!我們敲代碼就是一把梭哈!
效果圖
怎麼樣是不是很霸氣,必須選擇愛我!
這個程序由PyQt5製作生成,我個人覺得比較關鍵的點在於兩個:如何生成動畫,如何判斷滑鼠接觸到按鈕。下面我重點把這兩方面的代碼給大家展示一下,至於其它部分,為什麼的消息對話框能夠帶動畫之類的,大家看源碼吧!因為以前的文章裡面都涉及到了。
核心代碼
- 如何判斷滑鼠接觸到按鈕
#self.btai和self.btbuai是兩個按鈕,分別代表愛和不愛self.btai.setMouseTracking(True)self.btbuai.setMouseTracking(True)self.btai.installEventFilter(self)self.btbuai.installEventFilter(self)def eventFilter(self, object, event): if object == self.btbuai: if event.type() == QEvent.Enter: self.doAnim1() elif object == self.btai: if event.type() == QEvent.Enter: self.doAnim2() elif event.type() == QEvent.MouseButtonRelease: self.makelove() return QDialog.eventFilter(self, object, event)
上面的就是關於跟蹤滑鼠以及響應滑鼠事件的過程。
self.btai.setMouseTracking(True)self.btbuai.setMouseTracking(True)
這個屬性保存的是窗口部件跟蹤滑鼠是否生效。如果滑鼠跟蹤失效(默認),當滑鼠被移動的時候只有在至少一個滑鼠按鍵被按下時,這個窗口部件才會接收滑鼠移動事件。如果滑鼠跟蹤生效,如果沒有按鍵被按下,這個窗口部件也會接收滑鼠移動事件。
self.btai.installEventFilter(self)self.btbuai.installEventFilter(self)def eventFilter(self, object, event): if object == self.btbuai: if event.type() == QEvent.Enter: self.doAnim1() elif object == self.btai: if event.type() == QEvent.Enter: self.doAnim2() elif event.type() == QEvent.MouseButtonRelease: self.makelove() return QDialog.eventFilter(self, object, event)
其實這個就是事件過濾器的再次使用,我們在
學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框一文中就介紹了這個東東,大家可以再回顧一下。
我們給按鈕裝上事件過濾器,以self.btai為例,如果我們的滑鼠碰到這個按鈕的時候,就會執行self.doAnim2()函數,如果點擊這個按鈕時候(其實是滑鼠按下並釋放後),就會執行self.makelove()。
更多詳細的介紹,請見
學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框就不再重複了。
- 怎麼生成動畫
self.anim = QPropertyAnimation(self.btbuai, b"geometry")self.anim.setDuration(1500) self.anim.setStartValue(QRect(200, 150, 70, 25))self.anim.setEndValue(QRect(200, 30, 70, 25))self.anim.setEasingCurve(QEasingCurve.OutCubic)self.anim.start()
我們這裡用到了QPropertyAnimation這個類。QPropertyAnimation類定義了Qt的屬性動畫。
QPropertyAnimation以Qt屬性做差值,作為屬性值存儲在QVariants中,該類繼承自QVariantAnimation,並支持基類相同的元類型動畫。
聲明屬性的類必須是一個QObject(我們這裡是:self.btbuai),為了能夠讓屬性可以用做動畫效果,必須提供一個setter(這裡是:b」geometry」),這樣QPropertyAnimation才可以設置屬性的值。注意:這能夠使它讓許多Qt控制項產生動畫效果。
首先,我們通過構造函數創建一個QPropertyAnimation對象,其中elf.btbuai表示動畫作用的QObject對象,geometry則表示QObject的屬性。然後,可以指定屬性的開始值和結束值。
QVariantAnimation類詳細的描述了如何設置動畫。需要注意的是:如果沒有設置起始值,在QPropertyAnimation實例被創建時,屬性就會設置起始值為它有的值。
QPropertyAnimation就其本身而言非常奏效。對於複雜的動畫,例如:包含多個對象,則可以使用QAnimationGroup,動畫組是一個可以包含其它動畫的動畫,並可以管理動畫的播放。
self.anim.setDuration(1500) self.anim.setStartValue(QRect(200, 150, 70, 25))self.anim.setEndValue(QRect(200, 30, 70, 25))self.anim.setEasingCurve(QEasingCurve.OutCubic)self.anim.start()
- 這裡我們設置了動畫的時間1500毫秒;
- 動畫的對象的起始位置和大小;
- 動畫的移動樣式,這個移動樣式有很多很多,可以參考這個:QEasingCurve Class
- 啟動動畫;
自定義消息對話框
代碼很簡單,不再詳細描述了。具體的請見源碼,涉及的知識點,可以參考:
學點編程吧:PyQt5系列教程(21):標籤(QLabel)學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框最後
ok,今天的介紹暫時就到這裡吧,祝:有男(女)朋友的過個好節;暫時還沒有的,早日追到自己的Ta吧!
如果你喜歡本篇文章,請給我
點贊
讚賞
分享給你的好友們吧!
如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送:pyqt5love,會自動得到相應的百度網盤下載鏈接。
推薦閱讀:
TAG:PyQt | Python | 情人節ValentinesDay |