GUI学习之八——QToolButton的学习总结
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的学习总结的更多相关文章
- 【Spark-core学习之八】 SparkShuffle & Spark内存管理
[Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...
- day 86 Vue学习之八geetest滑动验证
Vue学习之八geetest滑动验证 本节目录 一 geetest前端web中使用 二 xxx 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 geetest前端web ...
- jackson学习之八:常用方法注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- C++ 学习资料搜寻与学习(第一期)(未完待续)
一.图形图像类 [Visual C++]vs2008/2005正确打开vs2010所创建项目的几种方法 jlins 2012-04-12 14:38 [Visual C++]关于无法打开包括文件:“S ...
- 【深度学习系列】迁移学习Transfer Learning
在前面的文章中,我们通常是拿到一个任务,譬如图像分类.识别等,搜集好数据后就开始直接用模型进行训练,但是现实情况中,由于设备的局限性.时间的紧迫性等导致我们无法从头开始训练,迭代一两百万次来收敛模型, ...
- (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去
原文:https://www.html.cn/archives/10111 注:本文根据 React 开发者学习线路图(2018) 结构编写了很多新手如何学习 React 的建议.2019 年有标题党 ...
- JavaWeb学习总结-04 Servlet 学习和使用
一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...
- 如何学习FPGA?FPGA学习必备的基础知识
如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA 基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...
- 强化学习之 免模型学习(model-free based learning)
强化学习之 免模型学习(model-free based learning) ------ 蒙特卡罗强化学习 与 时序查分学习 ------ 部分节选自周志华老师的教材<机器学习> 由于现 ...
随机推荐
- IIS 字符串过长
jquery.datatable.js---弹窗要用极速模式 <?xml version="1.0" encoding="utf-8"?><c ...
- 【python】django上传文件
参考:https://blog.csdn.net/zahuopuboss/article/details/54891917 参考:https://blog.csdn.net/zzg_550413470 ...
- 编译pcre 报错 error: Invalid C++ compiler or C++ compiler flags
安装c++ 编译器:yum -y install gcc-c++ ,再次编译通过.
- Python校验用户名是否合法示例
#校验用户名是否合法例子: #输入账号密码 #input #如果账号存在提示已经注册,如果不存在的,就可以注册 all_users [] #不能为空 #strip() #用户名长度6-12之间 #le ...
- xml模块学习
import xml.etree.ElementTree as ET tree = ET.parse("xmltest.xml") root = tree.getroot() pr ...
- bootstrap学习1
1.form-control -宽度变成了100% -设置了一个浅灰色(#ccc)的边框 -具有4px的圆角 -设置阴影效果,并且元素得到焦点之时,阴影和边框效果会有所变化 -设置了placehold ...
- 使用TensorFlow训练模型的基本流程【转】
原文地址(https://github.com/wmpscc/TensorflowBaseDemo ) 本篇文章将介绍使用tensorflow的训练模型的基本流程,包括制作读取TFRecord,训练和 ...
- Python 3.7 安装Twisted
win10电脑 64位系统 Python 3.7 版本安装Twisted-18.9.0-cp37-cp37m-win32.whl 会成功 先下载下来,放到 Scripts文件夹下 然后cmd 我的是 ...
- c++常见变量的极值
#include "numeric_limits.hpp"#include <limits>#include <iostream> //////////// ...
- shardingsphere多数据源(springboot + mybatis+shardingsphere+druid)
org.springframeword.boot:spring-boot-starer-web: 2.0.4release io.shardingsphere:sharding-jdbc-spring ...