赞
踩
QToolButton
工具按钮,一般在工具栏中显示,工具栏中的工具按钮一般只显示图标,供用户快捷的使用一些功能,它继承自QAbstractButton
。
创建一个 QToolButton
并设置其文本和图标:
from PyQt5.Qt import * import sys #0.创建一个APP app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QToolButton") w.resize(300,300) #创建一个 QToolButton tb = QToolButton(w) tb.setText("工具") tb.setIcon(QIcon("menu.ico")) w.show() sys.exit(app.exec_())
运行:
注意到,程序第14行虽然设置了文本,但是只显示了图标,这是因为已经设置了图标,文本默认就不再显示(如果不设置图标,则文本会正常显示),这是 QToolButton 的特性,可以通过setToolTip()
来设置提示文本:
from PyQt5.Qt import * import sys #0.创建一个APP app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QToolButton") w.resize(300,300) #创建一个 QToolButton tb = QToolButton(w) tb.setToolTip("这是一个菜单工具图标") tb.setIcon(QIcon("menu.ico")) w.show() sys.exit(app.exec_())
运行:
当光标移动到这个工具按钮上,就会显示一个文本来提示用户。setToolTip
在PyCharm中提示是QWedget
的方法,所以其子类都是可以使用的,而QToolButton
的父类QAbstractButton
是 QWedget的一个子类。
pyQt提供了几种风格供用户选择,可通过setToolButtonStyle(Qt.ToolButtonStyle)
来设置,上文提及只显示图标是其中一种风格,详情可见Qt文档:Qt工具按钮样式:
风格 | 含义 |
---|---|
Qt.ToolButtonIconOnly | 只显示图标(默认风格) |
Qt.ToolButtonTextOnly | 只显示文本 |
Qt.ToolButtonTextBesideIcon | 文本显示在图标旁 |
Qt.ToolButtonTextUnderIcon | 文本显示在图标下方 |
Qt.ToolButtonFollowStyle | 遵循风格 |
以下程序示例了设置文本和图标都显示的风格:
from PyQt5.Qt import * import sys #0.创建一个APP app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QToolButton") w.resize(300,300) #创建一个 QToolButton tb = QToolButton(w) tb.setText("工具") tb.setIcon(QIcon("menu.ico")) #设置文本显示在图标右侧 tb.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) w.show() sys.exit(app.exec_())
运行:
所以,默认方式只显示图标的方式可以通过API修改显示风格。
QToolButton 可以通过setArrowType(Qt.ArrowType)
设置箭头图标,即是显示一个箭头的按钮,参数是一个枚举类型,用来指定箭头的样式,详见Qt文档:箭头图标枚举类型:
枚举 | 含义 |
---|---|
Qt.NoArrow | 无箭头 |
Qt.UpArrow | 上箭头 |
Qt.DownArrow | 下箭头 |
Qt.LeftArrow | 左箭头 |
Qt.RightArrow | 右箭头 |
以下程序示例了设置一个默认样式的箭头:
from PyQt5.Qt import * import sys #0.创建一个APP app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QToolButton") w.resize(300,300) #创建一个 QToolButton tb = QToolButton(w) #显示一个向上的箭头 tb.setArrowType(Qt.UpArrow) w.show() sys.exit(app.exec_())
运行:
自动提示是一个按钮的效果,指的是按键扁平化,但是当光标接触按键时候,会效果响应(QPushButton的扁平化不会有该响应):
from PyQt5.Qt import * import sys #0.创建一个APP app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QToolButton") w.resize(300,300) #创建一个 QToolButton tb = QToolButton(w) tb.setIcon(QIcon("menu.ico")) #设置自动提示 tb.setAutoRaise(True) w.show() sys.exit(app.exec_())
运行:
QToolButton 同 QPushButton 可添加菜单,其程序的设计是一样的,但是,程序的响应略有不同:
from PyQt5.Qt import * import sys #0.创建一个APP app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QToolButton") w.resize(300,300) #创建菜单 menu = QMenu() #创建子菜单 sub_menu = QMenu(menu) sub_menu.setTitle("子菜单") sub_menu.setIcon(QIcon("menu.ico")) #在菜单中添加子菜单 menu.addMenu(sub_menu) #创建action并添加到菜单中 action = QAction(QIcon("menu.ico"),"行为",menu) menu.addAction(action) #响应action点击事件 action.triggered.connect(lambda:print("点击了 action")) #创建一个 QToolButton tb = QToolButton(w) tb.setIcon(QIcon("menu.ico")) tb.setAutoRaise(True) pb = QPushButton(w) pb.move(0,30) pb.setText("按键") #QToolBool添加菜单 tb.setMenu(menu) pb.setMenu(menu) w.show() sys.exit(app.exec_())
运行:
第11~25行:创建了一个菜单
第38行:将该菜单添加到 QToolButton 中
第39行:将该菜单添加到 QPushButton 中
可以看到,虽然使用同一个函数,但是它们执行的效果是不用的,普通按键添加菜单,只要鼠标点击则立刻响应弹出菜单,而工具按键需要短暂的长按才会弹出菜单,这是因为菜单弹出模式不同导致的。比如在浏览器的后退按钮中,单击会返回上一页,但是短暂的长按,会弹出一个历史菜单,用户可以直接返回到更历史的页面。
可通过setPopupMode(QToolButton.ToolButtonPopupMode)
函数来设置菜单的模式,详见:Qt工具按钮菜单模式
枚举 | 含义 |
---|---|
QToolButton.DelayedPopup | 延时打开 |
QToolButton.MenuButtonPopup | 添加一个箭头 |
QToolButton.InstantPopup | 立刻打开,点击不发送点击信号 |
以下程序示例了修改菜单的弹出样式:
from PyQt5.Qt import * import sys #0.创建一个APP app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QToolButton") w.resize(300,300) #创建菜单 menu = QMenu() #创建子菜单 sub_menu = QMenu(menu) sub_menu.setTitle("子菜单") sub_menu.setIcon(QIcon("menu.ico")) #在菜单中添加子菜单 menu.addMenu(sub_menu) #创建action并添加到菜单中 action = QAction(QIcon("menu.ico"),"行为",menu) menu.addAction(action) #响应action点击事件 action.triggered.connect(lambda:print("点击了 action")) #创建一个 QToolButton tb = QToolButton(w) tb.setIcon(QIcon("menu.ico")) tb.setAutoRaise(True) #添加菜单 到 QToolBool tb.setMenu(menu) #设置菜单模式 tb.setPopupMode(QToolButton.MenuButtonPopup) w.show() sys.exit(app.exec_())
运行:
这种模式下,QToolButton 被分成两部分,其中只有点击右边小三角形,才会显示菜单。
QToolButton 不算继承父类的信号,其特有一个triggered
信号,携带的参数为QAction
。当QToolButton菜单下的任何一个QAction被点击时候,发送该信号,所以程序创建一个槽函数来接收这个信号,并捕捉到被点击的QAction。
QAction 也有这个信号,当某个QAction被点击的时候,会发出这样的信号,但是QToolButton则是当它的菜单任何一个QAction被点击,都会发出此信号。
QToolButton 信号传递了一个QAction参数,为了便于区分到底是哪一个QAction传来的,我们可以给每一个QAction通过setData(Any)
来设置一个数据(可以是任何类型),然后在槽函数里面,通过data()
来返回数据。
示例程序:
#创建菜单 menu = QMenu() #创建子菜单 sub_menu = QMenu(menu) sub_menu.setTitle("子菜单") sub_menu.setIcon(QIcon("menu.ico")) #在菜单中添加子菜单 menu.addMenu(sub_menu) #创建action并添加到菜单中 act0 = QAction(QIcon("menu.ico"),"行为_0",menu) act1 = QAction(QIcon("menu.ico"),"行为_1",menu) act2 = QAction(QIcon("menu.ico"),"行为_3",menu) menu.addActions([act0,act1,act2]) act0.setData("act0") act1.setData("act1") act2.setData("act2") #创建一个 QToolButton tb = QToolButton(w) tb.setIcon(QIcon("menu.ico")) tb.setAutoRaise(True) #QToolBool添加菜单 tb.setMenu(menu) def action_slot(action): print(action.data()) tb.triggered.connect(action_slot) w.show() sys.exit(app.exec_())
运行:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。