文章目录
一、QToolButton 简介
QToolButton
工具按钮,一般在工具栏中显示,工具栏中的工具按钮一般只显示图标,供用户快捷的使用一些功能,它继承自QAbstractButton
。
二、QToolButton 创建和基本操作
创建一个 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的一个子类。
三、功能(API)
1. 设置工具按钮样式风格
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修改显示风格。
2. 设置箭头图标
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_())
运行:
3. 自动提升
自动提示是一个按钮的效果,指的是按键扁平化,但是当光标接触按键时候,会效果响应(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_())
运行:
4. 菜单设置
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 中
可以看到,虽然使用同一个函数,但是它们执行的效果是不用的,普通按键添加菜单,只要鼠标点击则立刻响应弹出菜单,而工具按键需要短暂的长按才会弹出菜单,这是因为菜单弹出模式不同导致的。比如在浏览器的后退按钮中,单击会返回上一页,但是短暂的长按,会弹出一个历史菜单,用户可以直接返回到更历史的页面。
5. 菜单弹出模式
可通过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 被分成两部分,其中只有点击右边小三角形,才会显示菜单。
四、信号
1.trigger
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_())
运行: