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. web 安全:

    XSSXSS 全称“跨站脚本”,是注入攻击的一种. 其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本. 这时服务器端如果没有过 ...

  2. Mysql 创建用户授权

    MySQL创建用户与授权 一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用 ...

  3. twisted的task之cooperator和scrapy的parallel()函数

    def handle_spider_output(self, result, request, response, spider): if not result: return defer_succe ...

  4. arcgis point 随着 line类型的轨迹运动的动画

    animate : function(frampoint,topoint,speed = 60){ var path = topoint.geometry.paths[0]; var i = 1; v ...

  5. nginx优化php-fpm优化 压力测试达到每分150万访问量webbench网站压力

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装:引用wget http: ...

  6. 基于WebGL架构的3D可视化平台—新风系统演示

    新风系统是根据在密闭的室内一侧用专用设备向室内送新风,再从另一侧由专用设备向室外排出,在室内会形成“新风流动场”,从而满足室内新风换气的需要.实施方案是:采用高风压.大流量风机.依靠机械强力由一侧向室 ...

  7. SpringCloud-day03-服务注册与发现组件Eureka

    5.服务注册与发现组件Eureka 5.1Eureka简介: Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中 ...

  8. ASP.NET结合Redis实现分布式缓存

    最近一个项目ASP.NET+MySQL 有的网页打开初始化的查询需要10秒甚至更久,用户体验极差,而且并发量变大的时候网站容易崩溃 后来想了两种解决方案都不是太满意 1.数据库里建一张缓存表,后台作业 ...

  9. Windows+Apache+mod_wsgi+Flask部署方法

    环境:windows7 64bit 1.python版本3.6.5,32位 2.下载Apache,版本httpd-2.4.33-o102o-x86-vc14-r2,32位,vc14编译 3.下载mod ...

  10. UTF-8和GBK有什么区别

    UTF-8和GBK有什么区别 2017年06月03日 18:10:43 阅读数:6516 GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准).GBK编码专门用来解决 ...