实战PyQt5: 008-按钮控件QPushButton

QAbstractButton简介

QAbstractButton类为一个抽象类,不能实例化,必须有其他按钮类来继承它以实现不同的功能和表现形式。QPushButton, QCheckButton, QRadioButto,QToolButton等常见按钮都继承自QAbstractButton。

QAbstractButton提供一个按钮所需的最基本的状态和信号。

QAbstractButton常用方法:

  • isEnable(); 按钮是否在使能状态, 提示按钮是否可以被用户点击;
  • isChecked();按钮是否处于标记状态;
  • isCheckAble(); 按钮是否可标记;
  • isDown(); 按钮是否已经按下;
  • setAutoRepeat(); 设置按钮是否在用户长按时可以自动重复执行。

QAbstractButton常用信号:

  • pressed();鼠标左键在按钮上按下时触发该信号;
  • released();鼠标左键释放时触发该信号;
  • clicked(); 鼠标左键在按钮上按下然后释放,或快捷键被释放时触发该信号;
  • toggled();按钮的标记状态发生改变时触发该信号。

QPushButton简介

QPushButton是PyQt中常用最常用的基本控件之一,按下(或者单击)一个QPushButton按钮给APP发送某个命令,让APP执行某个操作或者相应一些信息。一个PyQt 实现的APP中典型的按钮如确定,取消,关闭,是,否,帮助等等,一般都由QPushButton来实现。

QPushButton常用方法:

  • setText();设置按钮的显示文本;
  • setIcon();设置按钮上的图标;
  • setEnabled();设置按钮是否可用,设置为False时,按钮不可用;
  • setCheckable();设置按钮是否已经被选中,如果设置True,则表示按钮将保持已点击和释放状态;
  • text();返回按钮的显示文本;
  • toggle();在按钮状态之间进行切换;
  • isChecked();返回按钮的选中状态。

QPushButton类继承关系:

实战PyQt5: 008-按钮控件QPushButton

测试QPushButton

qpushbutton.py演示了怎样使用QPushButton来控制播放一个GIF动画图片,基本功能包括:

  • 播放/停止;
  • 逐帧前进/后退;
  • 到第一帧/最后一帧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import sys
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel, QPushButton, QStyle)
from PyQt5.QtGui import (QIcon, QMovie)
 
class DemoPushButton(QMainWindow):    
    def __init__(self, parent=None):
        super(DemoPushButton, self).__init__(parent)
       
        # 设置窗口标题
        self.setWindowTitle("实战PyQt5: QPushButton Demo!")      
        # 设置窗口大小
        self.resize(400, 420)
       
        # 图像尺寸
        img_width = 176 * 2
        img_height = 180 * 2
       
        # 播放状态记录变量
        self.is_playing = False
        self.is_pause = False
        self.total_frame = 0
        self.cur_frame = 0
 
        self.movie = QMovie(os.path.dirname(__file__) + "/use-python.gif")
        self.movie.setScaledSize(QtCore.QSize(img_width, img_height))
        self.movie.setCacheMode(QMovie.CacheAll)   #支持回卷
        self.total_frame = self.movie.frameCount() #保存总帧数
        label = QLabel(self)
        label.move(20, 10)
        label.setFixedSize(img_width, img_height)
        label.setMovie(self.movie)
        self.movie.jumpToFrame(0)
       
        self.btn_play = QPushButton(self)
        self.btn_play.setGeometry(20, 380, 60, 24)
        self.btn_play.clicked.connect(self.play)
        self.setPlayButtonState()
       
        btn_first = QPushButton(self)
        btn_first.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSkipBackward))
        btn_first.setText("到头")
        btn_first.setToolTip("到第一帧")
        btn_first.setGeometry(90, 380, 60, 24)
        btn_first.clicked.connect(self.firstFrame)
       
        btn_last = QPushButton(self)
        btn_last.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSkipForward))
        btn_last.setText("到尾")
        btn_last.setToolTip("到最后一帧")
        btn_last.setGeometry(160, 380, 60, 24)
        btn_last.clicked.connect(self.lastFrame)
       
        btn_prev = QPushButton(self)
        btn_prev.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSeekBackward))
        btn_prev.setText("前帧")
        btn_prev.setToolTip("到前一帧")
        btn_prev.setGeometry(230, 380, 60, 24)
        btn_prev.clicked.connect(self.prevFrame)
       
        btn_next = QPushButton(self)
        btn_next.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSeekForward))
        btn_next.setText("后帧")
        btn_next.setToolTip("到后一帧")
        btn_next.setGeometry(300, 380, 60, 24)
        btn_next.clicked.connect(self.nextFrame)
 
    #修改播放按钮的状态
    def setPlayButtonState(self):
        if self.is_playing :
            self.btn_play.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaPlay))
            self.btn_play.setText("停止")
            self.btn_play.setToolTip("点击按钮停止播放")  
        else:
            self.btn_play.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaStop))
            self.btn_play.setText("播放")
            self.btn_play.setToolTip("点击按钮开始播放")
 
    #播放按钮的槽函数
    def play(self):
        if self.is_playing:            
            self.movie.stop()
            self.movie.jumpToFrame(0) #回到第一帧
            self.is_playing = False        
        else:          
            self.movie.start()
            self.is_playing = True
        self.setPlayButtonState()
   
    #到设定的当前帧    
    def toFrame(self):
        if self.is_playing:
            self.movie.stop()
            self.is_playing = False
            self.setPlayButtonState()                
        self.movie.jumpToFrame(self.cur_frame)
       
    #到第一帧
    def firstFrame(self):
        self.cur_frame = 0
        self.toFrame()
           
    #到最后一帧
    def lastFrame(self):
        self.cur_frame = self.total_frame - 1
        self.toFrame()
   
    #到前一帧
    def prevFrame(self):
        if self.cur_frame <= 0:
            self.cur_frame = self.total_frame - 1
        else:
            self.cur_frame = self.cur_frame - 1
        self.toFrame()
       
    #到后一帧
    def nextFrame(self):
        if self.cur_frame >= self.total_frame - 1:
            self.cur_frame = 0
        else:
            self.cur_frame = self.cur_frame + 1
        self.toFrame()
           
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoPushButton()
    window.show()
    sys.exit(app.exec())

运行结果如下图所示:

实战PyQt5: 008-按钮控件QPushButton

测试QPushButton

本文知识点

  • 获得系统PyQt内置图标的方法;
  • 使用PyQt内置图标为QPushButton按钮设置图标;
  • 信号和槽函数的使用;
  • QMovie对GIF动画播出的基本操作函数;
  • QMovie支持回卷须设置setCacheMode(QMovie.CacheAll)。

前一篇: 实战PyQt5: 007-单行编辑控件QLineEdit