今天总结一下AbstractButton类的学习笔记。

一.描述

AbstractButton是对各种按键的抽象类他的继承关系是这样的

首先,QAbstractButton继承了QWidget类的各种用法;

其次,QAbstractButton是将各种按钮中共同存在的特性、功能抽象出来组成了一个类。所以他是所有按钮类的基类,提供了按钮的通用功能。但是由于他是给抽象类,不能直接实例化

from PyQt5.Qt import *
import sys
app=QApplication(sys.argv)
window = QWidget()
btn = QAbstractButton(window)
window.show()
sys.exit(app.exec_())

运行后发现有这样的提示

    btn = QAbstractButton(window)
TypeError: PyQt5.QtWidgets.QAbstractButton represents a C++ abstract class and cannot be instantiated

所以,在调用QAbstractButton时有两种方法:

1.对QAbstractButton进行子类化并对其所有方法重构

from PyQt5.Qt import *
from PyQt5 import QtGui
import sys
app=QApplication(sys.argv)
window = QWidget()
class Btn(QAbstractButton):
def paintEvent(self, e: QtGui.QPaintEvent):
#对按钮进行绘制
painter = QPainter(self)
pen = QPen(QColor(128,0,255),30) #设置笔QPen(QColor(RGB),笔粗细)
painter.setPen(pen)
painter.drawText(30,30,'画文本')
def mousePressEvent(self, e: QtGui.QMouseEvent):
#定义按键按下时的事件
print('按钮点击')
btn = Btn(window)
window.show()
sys.exit(app.exec_())

重新绘制按钮并定义点击事件

2.直接调用现有的子类

二.功能作用

我们对其按功能作用分出下面几点。由于不能直接使用QAbstractButton这个类,我们在实现功能的时候就用它的子类进行演示

1.设置文本

so easy,在前面已经试过了,没啥难的!

btn = QPushButton(window)
btn.setText('文本设置') #设置文本
btn.text() #获取文本

放个案例,按钮原始文本为1,每点击一下自增1。

from PyQt5.Qt import *
import sys
app=QApplication(sys.argv)
window = QWidget()
def add_1():
data = int(btn.text())
data+=1
btn.setText(str(data)) btn = QPushButton(window)
btn.setText('')
btn.resize(100,50) btn.clicked.connect(add_1)
window.show()
sys.exit(app.exec_())

案例一:按钮文本设置

2.图标相关

icon = QIcon(r'C:\Users\Aaron\Desktop\无标题.png')  #加载图片
size = QSize(30,30)                #定义尺寸
btn.setIcon(icon)                #设置图标
btn.setIconSize(size)              #设置图标尺寸
btn.icon()              #获取图标对象
btn.iconSize()              #获取图标尺寸

如果设置的图标尺寸大于原先定义的按钮尺寸,实际显示的按钮是会被“撑大”的

3.快捷键设置

实现按钮点击有多种方式1.鼠标点击,2获得焦点的按钮可以直接用键盘空格键触发,还有一种就是利用快捷键。这里讲快捷键的使用

快捷键设置有两种方式,

a.有提示文本的,在需要用的快捷键字母前加‘&“字符,触发事件是用ALT键加相对应的字母就可以了

btn.setText('&Click')

看,Click第字母C下面带下划线,用ALT+C键就实现按钮快捷键点击。&字符可以加在字符串的任何一个部位。

b.有些按钮是没有提示文本的,可以直接设置

btn.setShortcut('shift+A')      #Shift键+A键
btn.setShortcut('alt+A') #ALT键+A键
btn.setShortcut('alt+shift+A') #Shift键+ALT键+A键

这种方式还可以实现多个键位的快捷键。

4.自动重复

自动重复指用户没有松开鼠标,但是鼠标不断触发对应的槽函数(就像小时候玩的超级玛丽连跳或连发的那个键)

btn.setAutoRepeat(True)            #启动自动重复
btn.setAutoRepeatInterval(1000) #自动重复延时时间
btn.setAutoRepeatDelay(2000) #触发自动重复的首次延时(2s后才开始实现自动重复)
btn.autoRepeat() #获取是否自动触发
btn.autoRepeatInterval() #获取自动触发间隔时长
btn.autoRepeatDelay() #获取自动触发首次延时

放个案例,在第案例一上加个功能,点击鼠标不松2s后数字一直自增

from PyQt5.Qt import *
import sys
app=QApplication(sys.argv)
window = QWidget()
def add_1():
data = int(btn.text())
data+=1
btn.setText(str(data)) btn = QPushButton(window)
btn.setText('')
btn.resize(100,50) btn.clicked.connect(add_1)
btn.setAutoRepeat(True) #启动自动重复
btn.setAutoRepeatInterval(1000) #自动重复延时时间
btn.setAutoRepeatDelay(2000) #触发自动重复的首次延时(2s后才开始实现自动重复)
window.show()
sys.exit(app.exec_())

案例二:按键自动重复

5.状态

状态的设定和查询主要分下面几种

a.按下,指按钮被按下但未松开的状态(如同带自锁功能的机械开关一样,按下一直闭合)

btn.setDown(True)       #设置按下
btn.isDown() #获取是否被按下

b.选中:类似于多选框和复选框被选中的状态

btn.setCheckable(True)  #设置按钮能否被选中
btn.isCheckable() #获取按钮能否被选中
btn.setChecked(True) #设置按钮是否被选中
btn.isChecked() #获取按钮能否被选中
btn.toggle() #按钮状态取反

c.继承与QWidget里的使能、可见等状态

6.排他性

排他性只再一个父类里有多个按钮,如果都设置了排他性,则同时只能选一个。单选框按钮默认排他性就为True。

btn.setAutoExclusive(True)   #设置排他性
btn.autoExclusive() #获取排他性

要注意的是排他性的设置应该是同个父级控件内的按钮。

7.模拟点击

如果想直接调用按钮连接的槽函数,但是该函数无法直接调用(又可能是匿名函数)。就可以用按钮的模拟点击功能。

btn = QPushButton(window)
btn.clicked.connect(lambda :print('按钮被点击'))
btn.click() #模拟点击

有些时候想通过代码实现按钮的模拟点击的过程(有按钮被按下的动态显示),并设置按钮被模拟按下的时长。

btn1 = QPushButton('按钮1',window)
btn2 = QPushButton('按钮2',window)
btn2.move(100,100)
btn1.clicked.connect(lambda :btn2.animateClick(1000)) #模拟按钮被按下1000ms
btn2.clicked.connect(lambda :print('按钮2被按下'))

8.设置有效区域

在QPushButton内有一个功能

hitButton(self, pos: QtCore.QPoint):

首先,它包含了一个布尔量的返回值,如果返回值为True,则按钮向槽发送信号,反之也成立。

其次,pos里包含了点击位置的相对坐标。所以我们可以用这个功能实现按钮的有效区域设置

下面的案例就是在按钮内画一个内切圆,只有当鼠标点击位置在圆打印按钮被点击时才打印‘按钮被点击’

import sys
from PyQt5.Qt import *
from PyQt5 import QtGui
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
class Btn(QPushButton):
def paintEvent(self, a0: QtGui.QPaintEvent):
super().paintEvent(a0)
painter = QPainter(self)
painter.setPen(QPen(QColor(100,150,200),10))
painter.drawEllipse(self.rect())
def hitButton(self, pos):
click_x = pos.x()
click_y = pos.y()
circle_centre_x = self.width()/2 #圆心横坐标
circle_centre_y = self.height()/2 #圆心纵坐标
import math
distance = math.pow((click_x-circle_centre_x),2)+math.pow((click_y-circle_centre_y),2)
distance = math.sqrt(distance)
if distance<self.width()/2: #坐标小于半径
return True
else:
return False btn = Btn(window)
btn.setText('按钮')
btn.resize(300,300)
btn.move(200,150)
btn.clicked.connect(lambda :print('按钮被点击')) window.show()
sys.exit(app.exec_())

案例三:按钮有效区域设置

三.可用信号

除了上面说明的API,QAbstractButton类还有下面几种常用的信号

btn.pressed()           #鼠标按下按钮
btn.released() #鼠标松开按钮
btn.clicked() #按钮被点击
btn.toggled() #按钮状态切换

要了解的知识点:released()是鼠标放开,这个放开是不考虑松开时鼠标是否在按钮控件内的,而clicked()必须是按下和松开都在控件内。

GUI学习之五——QAbstractButton类学习笔记的更多相关文章

  1. GUI学习之五——QPushbutton类学习笔记

    QPushButton是QAbstractButton类下使用最多的子类,它的用法在上一章中基本讲完了,这里还总结了几个别的用法. 一.创建按钮 我们在前面所有的案例中创建按钮都是用这样的方式 win ...

  2. 设计模式学习起点 UML类图笔记

    UML类图笔记 大学开设的软件设计课程一般都会学习UML类图,大部分关于设计模式的描述都是使用的UML类图,可以说类图的表示是学习设计模式的起点.UML定义类之间的关系主要有六种:泛化关系.实现关系. ...

  3. Java_lambda表达式之"stream流学习,Map学习,collect学习,Conllectors工具类学习"

    Lambda表达式学习 对List<Integer> userIdList = UserList.stream().map(User::getUserId).collect(Collect ...

  4. php优秀框架codeigniter学习系列——CI_Lang类学习

    这篇文章主要介绍CI核心框架工具类CI_Lang. 根据CI文档自己的定义,该类用来: 提供相关的函数,用于检索语言文件和文本行,以便国际化. 以下选取类中的重点方法进行说明. __construct ...

  5. php优秀框架codeigniter学习系列——CI_Input类学习

    这篇文章主要介绍CI核心框架工具类CI_Input. 根据CI文档自己的定义,该类用来: 提前处理全局变量,以保证安全; 提供一些帮助函数用来处理输入数据. 以下选取类中的重点方法进行说明. __co ...

  6. php优秀框架codeigniter学习系列——CI_Security类学习

    这篇文章主要介绍CI核心框架工具类CI_Security. 安全类包含了一些方法,用于安全的处理输入数据,帮助你创建一个安全的应用.以下选取类中的重点方法进行说明. __construct() 在构造 ...

  7. php优秀框架codeigniter学习系列——CI_Router类学习

    这篇文章主要介绍CI核心框架工具类CI_Router. 如果说CI_URI类是用来解析URI,那么CI_Router类就应该是根据解析出来的URI来决定究竟访问哪一个文件和哪一个function. 详 ...

  8. php优秀框架codeigniter学习系列——CI_URI类学习

    这篇文章主要介绍CI核心框架工具类CI_URI. 该类主要用来解析uri和决定路由的.关于URI和URL的关系请参考这位朋友的文章.简单来说URI是唯一定位的资源,URL是唯一资源的一个网络可能访问路 ...

  9. Java学习:Properties类

    Java学习:Properties类 学习目标 认识properties文件,理解其含义,会正确创建properties文件. 会使用java.util.Properties类来操作propertie ...

随机推荐

  1. IntelliJ IDEA 打开项目红色

    项目目录红色主要是有版本控制所导致的,解决办法就是解除版本控制 点击File->Settings...->Version Control 项目会重新编译,项目目录红色会消失

  2. DBUtils工具类

    import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql. ...

  3. LeetCode 141. Linked List Cycle 判断链表是否有环 C++/Java

    Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...

  4. kubernetes nginx ingress controller部署

    Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...

  5. 用户未登录或Session超时时重定向到登录页,不那么简单

    在网站开发中,我们经常有这样的场景出现: 情景1:对未登录的用户或没有权限的用户,当其想访问某个受限网页时,系统要能够自动转到登录页面.   情景2:对于用session保存用户状态的情况还有这样一种 ...

  6. html页面转jsp后 乱码问题。

    在jsp文件中的html显示乱码是因为服务端和客户端的编码不一致导致的.如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码.解决办法:1.未指定使用字符集 ...

  7. 算法之Python实现 - 003 : 换钱的方法数

    [题目]给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的方法数. [代码1]递归 impor ...

  8. python之字典及其方法---整理集

    字典 特点: 使用逗号分隔的key:value形式: 使用大括号括起来: key-value的键值对中,value部分可以是任意类型: 列表.字典不能做为字典的key: 字典是无序的,哪个key-va ...

  9. [InstFiles]在Inno中打包隐藏和系统文件的头文件

    本文来自:http://www.kngstr.com 简介: 一直以来,Inno的作者都没有提供打包隐藏文件和系统文件的功能. 但是,如果我们做批量打包,批量封装的时候,总会需要这样的功能,因为我们不 ...

  10. esxi虚拟机克隆后的主机网卡设置

    windows 在虚拟机配置页面右击属性,编辑虚拟机设置,删除掉原来的网卡,重新添加新的网卡 进入系统以后,进入 windows/system32 找到sysprep,运行等待电脑重启 重启过程会稍微 ...