pyQt5 学习笔记(14)QToolButton 工具按钮控件

一、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_())

运行:
在这里插入图片描述

  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值