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类继承关系:

python 一个按钮执行两个函数_pyqt5

 

测试QPushButton

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

  • 播放/停止;
  • 逐帧前进/后退;
  • 到第一帧/最后一帧。
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())

运行结果如下图所示:

python 一个按钮执行两个函数_pyside2_02

测试QPushButton

本文知识点

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

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