当前位置:   article > 正文

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

pyqt5 qtoolbutton

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键添加一个菜单选项,使之可以正常速度,慢速,快速播放动画。完整代码如下:

  1. import sys
  2. import os
  3. from PyQt5 import QtCore, QtGui, QtWidgets
  4. from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel, QToolButton, QStyle, QMenu, QAction)
  5. from PyQt5.QtGui import (QIcon, QMovie)
  6. from PyQt5.QtCore import Qt
  7.  
  8. class DemoToolButton(QMainWindow):
  9.     def __init__(self, parent=None):
  10.         super(DemoToolButton, self).__init__(parent)
  11.         
  12.         # 设置窗口标题
  13.         self.setWindowTitle("实战PyQt5: QToolButton Demo!")      
  14.         # 设置窗口大小
  15.         self.resize(400420)
  16.         
  17.         # 图像尺寸
  18.         img_width = 176 * 2
  19.         img_height = 180 * 2
  20.         
  21.         # 播放状态记录变量
  22.         self.is_playing = False
  23.         self.is_pause = False
  24.         self.total_frame = 0
  25.         self.cur_frame = 0
  26.  
  27.         self.movie = QMovie(os.path.dirname(__file__) + "/use-python.gif")
  28.         self.movie.setScaledSize(QtCore.QSize(img_width, img_height))
  29.         self.movie.setCacheMode(QMovie.CacheAll)   #支持回卷
  30.         self.total_frame = self.movie.frameCount() #保存总帧数
  31.         label = QLabel(self)
  32.         label.move(2010)
  33.         label.setFixedSize(img_width, img_height)
  34.         label.setMovie(self.movie)
  35.         self.movie.jumpToFrame(0)
  36.         
  37.         self.btn_play = QToolButton(self)
  38.         self.btn_play.setGeometry(203806024)
  39.         self.btn_play.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
  40.         self.btn_play.clicked.connect(lambda: self.play(100))
  41.         
  42.         # 创建三种不同速率播放的Action
  43.         action_slow = QAction('慢速播放', self)
  44.         action_slow.triggered.connect(lambda: self.play(25))
  45.         action_normal = QAction('常速播放', self)
  46.         action_normal.triggered.connect(lambda: self.play(100))
  47.         action_fast = QAction('快速播放', self)
  48.         action_fast.triggered.connect(lambda: self.play(400))        
  49.         
  50.         #弹出菜单
  51.         self.popup_menu = QMenu(self)
  52.         self.popup_menu.addAction(action_slow)
  53.         self.popup_menu.addAction(action_normal)
  54.         self.popup_menu.addAction(action_fast)
  55.         
  56.         self.btn_play.setPopupMode(QToolButton.MenuButtonPopup)
  57.         self.btn_play.setAutoRaise(True)
  58.         self.btn_play.setMenu(self.popup_menu)
  59.         
  60.         self.setPlayButtonState()
  61.         
  62.         btn_first = QToolButton(self)
  63.         btn_first.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSkipBackward))
  64.         btn_first.setText("到头")
  65.         btn_first.setToolTip("到第一帧")
  66.         btn_first.setGeometry(903806024)
  67.         btn_first.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
  68.         btn_first.setStyleSheet('border: 0px')
  69.         btn_first.clicked.connect(self.firstFrame)
  70.         
  71.         btn_last = QToolButton(self)
  72.         btn_last.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSkipForward))
  73.         btn_last.setText("到尾")
  74.         btn_last.setToolTip("到最后一帧")
  75.         btn_last.setGeometry(1603806024)
  76.         btn_last.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
  77.         btn_last.setStyleSheet('border: 0px')
  78.         btn_last.clicked.connect(self.lastFrame)
  79.         
  80.         btn_prev = QToolButton(self)
  81.         btn_prev.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSeekBackward))
  82.         btn_prev.setText("前帧")
  83.         btn_prev.setToolTip("到前一帧")
  84.         btn_prev.setGeometry(2303806024)
  85.         btn_prev.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
  86.         btn_prev.setStyleSheet('border: 0px')
  87.         btn_prev.clicked.connect(self.prevFrame)
  88.         
  89.         btn_next = QToolButton(self)
  90.         btn_next.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaSeekForward))
  91.         btn_next.setText("后帧")
  92.         btn_next.setToolTip("到后一帧")
  93.         btn_next.setGeometry(3003806024)
  94.         btn_next.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
  95.         btn_next.setStyleSheet('border: 0px')
  96.         btn_next.clicked.connect(self.nextFrame)
  97.  
  98.     #修改播放按钮的状态
  99.     def setPlayButtonState(self):
  100.         if self.is_playing :
  101.             self.btn_play.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaStop))
  102.             self.btn_play.setText("停止"
  103.             self.btn_play.setToolTip("点击按钮停止播放")  
  104.             self.popup_menu.setEnabled(False)
  105.         else:
  106.             self.btn_play.setIcon(QApplication.style().standardIcon(QStyle.SP_MediaPlay))
  107.             self.btn_play.setText("播放")
  108.             self.btn_play.setToolTip("点击按钮开始播放")
  109.             self.popup_menu.setEnabled(True)
  110.                        
  111.     #播放按钮的槽函数
  112.     def play(self, speed):
  113.         if self.is_playing:            
  114.             self.movie.stop()
  115.             self.movie.jumpToFrame(0#回到第一帧
  116.             self.is_playing = False         
  117.         else:          
  118.             self.movie.start()
  119.             self.movie.setSpeed(speed)
  120.             self.is_playing = True
  121.         self.setPlayButtonState()
  122.     
  123.     #到设定的当前帧    
  124.     def toFrame(self):
  125.         if self.is_playing:
  126.             self.movie.stop()
  127.             self.is_playing = False
  128.             self.setPlayButtonState()                 
  129.         self.movie.jumpToFrame(self.cur_frame)
  130.        
  131.     #到第一帧
  132.     def firstFrame(self):
  133.         self.cur_frame = 0
  134.         self.toFrame()
  135.             
  136.     #到最后一帧
  137.     def lastFrame(self):
  138.         self.cur_frame = self.total_frame - 1
  139.         self.toFrame()
  140.     
  141.     #到前一帧
  142.     def prevFrame(self):
  143.         if self.cur_frame <= 0:
  144.             self.cur_frame = self.total_frame - 1
  145.         else:
  146.             self.cur_frame = self.cur_frame - 1
  147.         self.toFrame()
  148.         
  149.     #到后一帧
  150.     def nextFrame(self):
  151.         if self.cur_frame >= self.total_frame - 1:
  152.             self.cur_frame = 0
  153.         else:
  154.             self.cur_frame = self.cur_frame + 1
  155.         self.toFrame()
  156.         
  157. if __name__ == '__main__':
  158.     app = QApplication(sys.argv)
  159.     window = DemoToolButton()
  160.     window.show()
  161.     sys.exit(app.exec())        

运行结果如下图:

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

QToolButton测试效果

本文知识点

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/961263
推荐阅读
相关标签
  

闽ICP备14008679号