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):構建我們自己的密碼輸入框zhuanlan.zhihu.com圖標

一文中就介紹了這個東東,大家可以再回顧一下。

我們給按鈕裝上事件過濾器,以self.btai為例,如果我們的滑鼠碰到這個按鈕的時候,就會執行self.doAnim2()函數,如果點擊這個按鈕時候(其實是滑鼠按下並釋放後),就會執行self.makelove()。

更多詳細的介紹,請見

學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框zhuanlan.zhihu.com圖標

就不再重複了。

  • 怎麼生成動畫

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)zhuanlan.zhihu.com圖標學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框zhuanlan.zhihu.com圖標

最後

ok,今天的介紹暫時就到這裡吧,祝:有男(女)朋友的過個好節;暫時還沒有的,早日追到自己的Ta吧!

如果你喜歡本篇文章,請給我

點贊

讚賞

分享給你的好友們吧!

如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送:pyqt5love,會自動得到相應的百度網盤下載鏈接。


推薦閱讀:

TAG:PyQt | Python | 情人節ValentinesDay |