实战PyQt5: 012-工具按钮控件QToolButton

本文介绍了QToolButton在PyQt5中的使用,它常用于工具栏,支持显示图标和文本,并能弹出菜单。通过示例代码展示了如何设置按钮样式、添加菜单以及实现不同速度的播放控制。此外,还涵盖了QAction和QMenu的使用,以及利用lambda传递参数给槽函数。
摘要由CSDN通过智能技术生成

QToolButton简介

QToolButton工具按钮, 最常用于QToolBar中,不同于QPushButton, QToolButton通常不显示文本标签,而只显示一个图标, 但在同时在按钮上显示图标和文本,QToolButton中文字和图标的排列方式更丰富一些(虽然QPushButton也可以实现,但麻烦得多)。

QToolButton可以使用弹出按钮,弹出一个菜单,以方便提供丰富的操作。

QToolButton的常用方法有:

  • setText(): 设置按钮的显示文本;
  • setIcon(): 设置按钮上的图标;
  • setEnabled(): 设置按钮是否可用,设置为False时,按钮不可用;
  • text(): 返回按钮的显示文本;
  • setToolButtonStyle (): 设置工具按钮样式,取值见下面的工具按钮样式表;
  • setArrowType (): 设置按钮样式,取值见下面的箭头样式取值列表;
  • setMenu(): 设置菜单;
  • setPopupMode(): 设置菜单弹出模式,取值见下面菜单弹出模式表。

QToolButton按钮样式:

  • Qt.ToolButtonIconOnly: 只显示图标(默认风格)
  • Qt.ToolButtonTextOnly: 只显示文本
  • Qt.ToolButtonTextBesideIcon: 文本显示在图标旁
  • Qt.ToolButtonTextUnderIcon: 文本显示在图标下方
  • Qt.ToolButtonFollowStyle: 遵循风格

QToolButton箭头样式:

  • Qt.NoArrow: 无箭头;
  • Qt.UpArrow: 向上箭头;
  • Qt.DownArrow: 向下箭头;
  • Qt.LeftArrow: 向左箭头;
  • Qt.RightArrow: 向右箭头。

菜单弹出模式:

  • QToolButton.DelayedPopup: 延时打开;
  • QToolButton.MenuButtonPopup: 添加一个箭头;
  • QToolButton.InstantPopup: 立刻打开,点击不发送点击信号。

QToolButton类继承关系:

实战PyQt5: 012-工具按钮控件QToolButton

 

测试QToolButton

创建文件qtoolbutton.py, 使用和QPushButton相似的例子,在Play键添加一个菜单选项,使之可以正常速度,慢速,快速播放动画。完整代码如下:

import sys
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel, QToolButton, QStyle, QMenu, QAction)
from PyQt5.QtGui import (QIcon, QMovie)
from PyQt5.QtCore import Qt
 
class DemoToolButton(QMainWindow):
    def __init__(self, parent=None):
        super(DemoToolButton, self).__init__(parent)
        
        # 设置窗口标题
        self.setWindowTitle("实战PyQt5: QToolButton 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 = QToolButton(self)
        self.btn_play.setGeometry(20, 380, 60, 24)
        self.btn_play.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self.btn_play.clicked.connect(lambda: self.play(100))
        
        # 创建三种不同速率播放的Action
        action_slow = QAction('慢速播放', self)
        action_slow.triggered.connect(lambda: self.play(25))
        action_normal = QAction('常速播放', self)
        action_normal.triggered.connect(lambda: self.play(100))
        action_fast = QAction('快速播放', self)
        action_fast.triggered.connect(lambda: self.play(400))        
        
        #弹出菜单
        self.popup_menu = QMenu(self)
        self.popup_menu.addAction(action_slow)
        self.popup_menu.addAction(action_normal)
        self.popup_menu.addAction(action_fast)
        
        self.btn_play.setPopupMode(QToolButton.MenuButtonPopup)
        self.btn_play.setAutoRaise(True)
        self.btn_play.setMenu(self.popup_menu)
        
        self.setPlayButtonState()
        
        btn_first = QToolButton(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.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        btn_first.setStyleSheet('border: 0px')
        btn_first.clicked.connect(self.firstFrame)
        
        btn_last = QToolButton(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.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        btn_last.setStyleSheet('border: 0px')
        btn_last.clicked.connect(self.lastFrame)
        
        btn_prev = QToolButton(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.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        btn_prev.setStyleSheet('border: 0px')
        btn_prev.clicked.connect(self.prevFrame)
        
        btn_next = QToolButton(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.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        btn_next.setStyleSheet('border: 0px')
        btn_next.clicked.connect(self.nextFrame)
 
    #修改播放按钮的状态
    def setPlayButtonState(self):
        if self.is_playing :
            self.btn_play.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaStop))
            self.btn_play.setText("停止") 
            self.btn_play.setToolTip("点击按钮停止播放")  
            self.popup_menu.setEnabled(False)
        else:
            self.btn_play.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaPlay))
            self.btn_play.setText("播放")
            self.btn_play.setToolTip("点击按钮开始播放")
            self.popup_menu.setEnabled(True)
                       
    #播放按钮的槽函数
    def play(self, speed):
        if self.is_playing:            
            self.movie.stop()
            self.movie.jumpToFrame(0) #回到第一帧
            self.is_playing = False         
        else:          
            self.movie.start()
            self.movie.setSpeed(speed)
            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 = DemoToolButton()
    window.show()
    sys.exit(app.exec())        

运行结果如下图:

实战PyQt5: 012-工具按钮控件QToolButton

QToolButton测试效果

本文知识点

  • QToolButton设置按钮和文字的排列方式;
  • QToolButton添加弹出菜单;
  • 根据QMenu生成一个菜单;
  • 使用QAction为菜单项添加行为;
  • 使用lambda 为槽函数传递参数。

前一篇: 实战PyQt5: 011-单选框控件QRadioButton

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值