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. 8. springboot logback 日志整合

    在resources目录下,新建log/logback-spring.xml文件,内容如下: <?xml version="1.0" encoding="UTF-8 ...

  2. open函数新建文件报错

    报错原因很多,我这里只写我遇到的: 给的路径或者文件名中包含了这些字符的:/\:*?"><| 都不行,我说的是Windows平台下的.

  3. C# 小算法1

    //判断 第一条的 ‘叶子2’ 在 第二条 数据中的 索引 //任河特大桥,右幅,叶子2,桩基混凝土, //任河特大桥,,,,,右幅,,,叶子2,桥墩, string str1 = "任河特 ...

  4. webpack 4.0配置

    webpack一般是本地安装,一般安装webpack webpack-cli,一般是开发依赖上线的时候不需要打包通常npm install webpack webpack-cli  -D安装 安装的时 ...

  5. Maven插件maven-shade-plugin打包配置

    转载以下两篇文章 https://www.cnblogs.com/fuxinci/p/3356087.html https://chenzhou123520.iteye.com/blog/197132 ...

  6. springboot项目js文件404

    如果检查路径没有问题,其他的js都可以引入,只有新改动的js报404的话,可以尝试重启IDE,并清除缓存.

  7. 安装好visual studio后,如何添加新的工作负载和组件

    重新运行visual studio安装程序,出现添加删除组件的界面,勾选即可.

  8. laravel 模型操作

    1. 简介 2. 创建模型 //模型文件默认创建在app目录下,也可以指定创建在某个文件夹下,如Model/Goods 1. php artisan make:model Goods 2. 这种方式会 ...

  9. 大数据学习笔记5 - Spark

    Spark是一个基于内存计算的大数据并行计算框架.所以,Spark并不能完全替代Hadoop,主要用于替代Hadoop中的MapReduce计算模型. 在实际应用中,大数据处理无非是以下几个类型: 复 ...

  10. 初次见面,C++(的博客作业)

    懵懂无知.编程是什么?要是你在两个月前问我这个问题,你可能只会得到一个回答“天知道”.依稀记得在初中,上电脑课的老师曾经触及过编程的皮毛(那时候也没有编程的概念,听的似懂非懂),旁边一个同学却在十分熟 ...