QToolButton提供一个快速的访问按钮,通常在工具栏内使用,一般不显示文本标签而显示图标。

一.按钮的样式风格设置

可以按照下面的风格对按钮进行样式设置

从左到右依次是仅显示图标、仅显示文字、图标在文本左侧和文字在图标下侧。代码是这样的

btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)  #设置样式
btn.toolButtonStyle() #获取样式
#下面是样式设置的枚举值
Qt.ToolButtonIconOnly #仅显示图标 ,返回值0
Qt.ToolButtonTextOnly #仅显示文本,返回值1
Qt.ToolButtonTextBesideIcon #文本显示在图标旁边,返回值2
Qt.ToolButtonTextUnderIcon #文本显示在图标下面,返回值3
Qt.ToolButtonFollowStyle #遵循风格,返回值4

二. 箭头样式

好多可以扩展的工具栏按钮是有扩展的箭头的,上面图上就是显示了Word带箭头的工具栏按钮。我们可以设置它的样式

btn.setArrowType(Qt.RightArrow)
print(btn.arrowType()) Qt.NoArrow #无箭头,返回值0
Qt.UpArrow #向上箭头,返回值1
Qt.DownArrow #向下箭头,返回值2
Qt.LeftArrow #向左箭头,返回值3
Qt.RightArrow #向右箭头,返回值4

这里要清楚一点:箭头的优先级是高于图标的,就是说设置了箭头图标就不显示了(就目前的水平而言),但是如果样式风格设置为只显示文本箭头也是不显示的。

四.自动提升

工具栏按钮的自动提升和QPushButton的扁平化是一样的视觉效果,区别就是设置后当鼠标指向按钮时外观会发生变化,而扁平化只有点击后才变化。(扁平化是QPushButton类里的功能,QToolButton是没有的。)

btn.setAutoRaise(True)   #设置自动提升
btn.autoRaise() #获取是否设置了自动提升

所以设置了autoraise后的按钮外观有三种效果:常规效果、鼠标指向时的效果和鼠标按下时的效果(图中从左到右)。

五.菜单应用

我们先做一个最简单的目录,并连接在工具栏按钮上

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600) btn = QToolButton(window)
btn.setText('menu') menu = QMenu() action_1 = QAction(menu)
action_1.setText('')
action_2 = QAction(menu)
action_2.setText('')
menu.addAction(action_1)
menu.addAction(action_2)
btn.setMenu(menu) window.show()
sys.exit(app.exec_())

工具栏菜单

运行后发现点击按钮菜单是不会弹出的,因为QPushButton的setmenu和QToolButton里的setmenu是不一样的。只有鼠标按下按钮并保持按下一段时间菜单才会弹出。就像浏览器的后退按钮,按下保持后会弹出一个菜单

在后退按钮上是有鼠标点击的,但截图时候鼠标无法截取。

btn.setPopupMode(QToolButton.MenuButtonPopup)  #设置菜单弹出模式
btn.popupMode() #获取菜单弹出模式
#菜单弹出模式枚举值
QToolButton.DelayedPopup #延时弹出菜单,返回值0
QToolButton.MenuButtonPopup#鼠标按下箭头时弹出,返回值1
QToolButton.InstantPopup #鼠标按下按钮时弹出,返回值2

这里要注意一点:菜单的弹出有时候会影响到信号的发射

btn.clicked.connect(lambda :print('按钮被按下'))

我们在这里加个信号和槽。

运行后会发现当菜单弹出时槽函数是不会运行的。

六.信号

除了继承父类的信号外,QToolButton最常用的信号是

QToolButton.triggered()

这个triggered()和QAction类里的triggered()是不同的。他是可以传递一个Qaction作为参数的。

def btn_call(action):
print(action)
btn.triggered.connect(btn_call)

可以把上面的代码加工具栏菜单的案例中,运行一下看一看效果。

鉴于上面所说的方式,可以有个小用法:

当需要调用菜单里各个action时,原先的方式是对每个action进行定义,比方这样(假设菜单里有action1和action2,每次点击就打印"action1(2) is called",原先的方法是这样的

action_1.triggered.connect(lambda :print('action1 is called'))
action_2.triggered.connect(lambda :print('action2 is called'))

但是如果菜单里的行为比较多,需要一个个写,比较麻烦可以用QAction里的setdata()来绑定数据后直接获取数据就可以

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600) btn = QToolButton(window)
btn.setText('menu') btn.clicked.connect(lambda :print('按钮被按下'))
menu = QMenu() action_1 = QAction(menu)
action_1.setText('action1') action_2 = QAction(menu)
action_2.setText('action2')
action_1.setData('action1 is called') #action_1绑定数据
action_2.setData('action2 is called') #action_2绑定数据 menu.addAction(action_1) menu.addAction(action_2)
btn.setMenu(menu) def btn_call(action):
print(action.data()) #获取action里的数据 btn.triggered.connect(btn_call)
window.show()
sys.exit(app.exec_())

trigged信号用法

这样就不用每个对信号进行绑定了。

GUI学习之八——QToolButton的学习总结的更多相关文章

  1. 【Spark-core学习之八】 SparkShuffle & Spark内存管理

    [Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...

  2. day 86 Vue学习之八geetest滑动验证

    Vue学习之八geetest滑动验证   本节目录 一 geetest前端web中使用 二 xxx 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 geetest前端web ...

  3. jackson学习之八:常用方法注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. C++ 学习资料搜寻与学习(第一期)(未完待续)

    一.图形图像类 [Visual C++]vs2008/2005正确打开vs2010所创建项目的几种方法 jlins 2012-04-12 14:38 [Visual C++]关于无法打开包括文件:“S ...

  5. 【深度学习系列】迁移学习Transfer Learning

    在前面的文章中,我们通常是拿到一个任务,譬如图像分类.识别等,搜集好数据后就开始直接用模型进行训练,但是现实情况中,由于设备的局限性.时间的紧迫性等导致我们无法从头开始训练,迭代一两百万次来收敛模型, ...

  6. (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去

    原文:https://www.html.cn/archives/10111 注:本文根据 React 开发者学习线路图(2018) 结构编写了很多新手如何学习 React 的建议.2019 年有标题党 ...

  7. JavaWeb学习总结-04 Servlet 学习和使用

    一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...

  8. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

  9. 强化学习之 免模型学习(model-free based learning)

    强化学习之 免模型学习(model-free based learning) ------ 蒙特卡罗强化学习 与 时序查分学习 ------ 部分节选自周志华老师的教材<机器学习> 由于现 ...

随机推荐

  1. ReactNative 学习笔记

    1. react-native引入第三方库时报Command `run-android` unrecognized: 在使用第三方库tab-navigator时调用: npm install reac ...

  2. Crontab 执行时没有环境变量!

    Crontab 执行时没有环境变量! Crontab 执行时没有环境变量! Crontab 执行时没有环境变量! 重要的事情说三遍,浪费我半天时间去找问题!! 非系统默认工具,执行时候需要加全路径!!

  3. js常用身份校验规则

    js常用身份校验规则 var Validator = { extractBirth: function(id) { // 身份证提取出生年月 var re = null, split, year, m ...

  4. springboot security

    Authority    权限Credential    证书Grant    授予 Authentication 身份验证 以下,我们将通过四步,逐步实现spring-security的userna ...

  5. mysql安装,以及从csv插入数据

    1.mysql安装 用管理员身份打开cmd命令行工具,cd到解压文件的bin目录:    ・MySql的Windows服务安装: mysqld install 回车 ・生成无密码的root用户: my ...

  6. elasticsearch增删查改

    创建结构化索引 put http://127.0.0.1:9200/person{ "settings" : { "number_of_shards": 3, ...

  7. (转)Thinkpad X1 Carbon 扩展硬盘

    http://tieba.baidu.com/p/5837920925 网上看到有人成功利用X1C空闲的4G模块来实现了扩充用的是东芝RC100或者建兴的T11 其实难点应该是2242这种尺寸的SSD ...

  8. 阿里云单机快速部署K8S

    网上有很多关于K8S部署测试环境的文章,但是有些部署比较繁琐.这里推荐使用 https://github.com/gjmzj/kubeasz地址文章.文章介绍很详细,记录一下方便自己日后学习使用. # ...

  9. “AS3.0高级动画编程”学习:第二章转向行为(下)

    在上一篇里,我们学习了“自主角色”的一些基本行为:寻找(seek).避开(flee).到达(arrive).追捕(pursue).躲避(evade).漫游(wander).这一篇将继续学习其它更复杂, ...

  10. Python设计模式 - UML - 组合结构图(Composite Structure Diagram)

    简介 组合结构图用来显示组合结构或部分系统的内部构造,包括类.接口.包.组件.端口和连接器等元素,是UML2.0的新增图. 组合结构图侧重复合元素的方式展示系统内部结构,包括与其他系统的交互接口和通信 ...