QAbstractButton是所有按钮控件的基类,学习了这个基类,便可以学习到其他按钮的通用功能,具体分为显示文本、设置图标、设置快捷键、自动重复、状态设置、排他性、模拟点击、设置有效区域、可用信号。
QAbstractButton是继承自QWidget的。
这里就开始介绍按钮的通用功能。
子类化抽象类
什么叫子类化抽象类。就是QAbstractButton是一个抽象的类别,没法直接调用和显示。
下面的例子中,自定义了一个按钮,继承于QAbstractButton的控件就会有按钮的基本功能。
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("QAbstractButton") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
# 自己定制一个按钮,继承于QAbstractButton
class Btn(QAbstractButton):
def paintEvent(self, evt):
# print("绘制按钮")
# 可以看不懂,用来绘制一个内容,抽象的类具体化
painter = QPainter(self) # 创建一个画家
pen = QPen(QColor(100, 150, 50), 6) # 创建一个笔
painter.setPen(pen) # 笔给画家
# 绘画
painter.drawText(20, 20, "社会人") # 绘制文本
painter.drawEllipse(0, 0, 100, 100)
btn = Btn(window)
btn.resize(100, 100)
window.show() # 显示窗口,不然啥也没有
# 自己定义的按钮也有按钮基本的功能,例如点击
btn.pressed.connect(lambda: print("点击了这个按钮"))
sys.exit(app.exec_())
通用功能1:设置文本
API:
- setText() : 设置按钮的提示文本
- text() : 获取按钮的提示文本
案例:设置一个按钮,初始文字为1,每点击一次数字就增加1。
根据上一节的知识我们知道,直接的QAbstractButton类是无法展示的。在本节就不再重写一个类继承QAbstractButton,而是直接用写好的系统提供的QPushButton来演示。
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
# 创建其他控件
btn = QPushButton(window)
btn.setText("1")
def plus():
num = int(btn.text())+1
btn.setText(str(num))
btn.pressed.connect(plus)
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
通用功能2:图标提示
API:
- setIcon(QIcon("图片路径")) : 设置图标
- setIconSize(QSize(w, h)) : 设置图标大小
- icon() : 获取图标
- iconSize() :获取图标大小
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
# 创建其他控件
btn = QPushButton(window)
btn.setText("1")
icon = QIcon("飞机.png")
btn.setIcon(icon)
size = QSize(100, 100) # 需要注意的是,设置尺寸需要一个QSize类型
btn.setIconSize(size)
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
通用功能3:设置快捷键
- 作用:通过指定的快捷键,触发按钮的点击
方式:
- 1、有提示文本的,如果提示文本包含“&”符号,则QAbstractButton会自动创建快捷键
- 2、没有提示文本的,setshortcut("快捷键组合")
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
# 创建其他控件
btn = QPushButton(window)
btn.setText("&abcdefg") # 因为&符号,此时“alt+a”组合键就是相当于按下这个按钮
btn.pressed.connect(lambda: print("快捷键"))
btn.setShortcut("Alt+m") # 自定义的快捷键
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
通用功能4:自动重复
自动重复,就是指只要按下这个按钮,就会一直发送信号。例如在一个射击游戏中,点一下按钮发射一个子弹,一直按着按钮,就一直发射子弹。这就是自动重复的效果。
API:
- setAutoRepeat(bool) 设置自动重复
- setAutoRepeatInterval(毫秒) 设置自动重复检测间隔
- setAutoRepeatDelay(毫秒) 设置初次检测延迟
- autoRepeat() 获取是否自动重复
- autoRepeatInterval() 获取自动重复检测间隔
- autoRepeatDelay() 获取初次检测延迟
现在把这个自动延迟和上面的设置文本计数联动起来做一个案例:
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
# 创建其他控件
btn = QPushButton(window)
btn.setText("1")
def plus():
num = int(btn.text()) + 1
btn.setText(str(num))
btn.pressed.connect(plus)
# 设置自动重复
btn.setAutoRepeat(True) # 按下不松开则一直触发信号
btn.setAutoRepeatDelay(2000) # 首次按下两秒之后就再重复
btn.setAutoRepeatInterval(2000) # 设置自动间隔
print(btn.autoRepeat())
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
通用功能5:状态设置
设置按钮的状态,可以引导用户进行下一步的工作。
isDown() : 是否按下按钮
setDown(bool) : 设置按钮是否被按下
setChecked(bool) :设置被选中
isChecked() :是否选中了按钮
isCheckable() :按钮是否可以被选中
toggle() :切换选中与非选中状态
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
btn = QPushButton(window)
btn.setText("切换按钮状态")
def cao():
# print("槽函数")
btn1.toggle()
btn2.toggle()
btn3.toggle()
btn.pressed.connect(cao)
# 创建其他控件
btn1 = QPushButton(window)
btn1.setText("这是一个QPushButton")
btn1.move(100, 100)
btn2 = QRadioButton(window)
btn2.setText("这是一个QRadioButton")
btn2.move(100, 150)
btn3 = QCheckBox(window)
btn3.setText("这是一个QRadioButton")
btn3.move(100, 200)
# 把三个按钮都置位按下状态
# btn1.setDown(True)
# btn2.setDown(True)
# btn3.setDown(True)
# 查看按钮是否可以被选中
print(btn1.isCheckable()) # False
print(btn2.isCheckable()) # True
print(btn3.isCheckable()) # True
# 单纯一个按钮是无法选中的,单选按钮和复选按钮则是可以的
btn1.setChecked(True)
btn2.setChecked(True)
btn3.setChecked(True)
# 设置按钮不可用
btn1.setEnabled(False)
btn2.setEnabled(False)
btn3.setEnabled(False)
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
通用功能5:排他性
- setAutoExclusive(bool) 设置排他性
这种只能选择一个的按钮叫做排他性:
像这种可以选择多个的就没有排他性:
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
for i in range(0, 3):
btn = QPushButton(window)
btn.setText("btn"+str(i))
btn.move(50*i, 50*i)
# 设置按钮式可选的
btn.setCheckable(True)
# 设置了排他性
btn.setAutoExclusive(True)
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
需要注意的是,只有同级控件会有排他性,相同父控件。
需要注意的是,QRadioButton本身就是带有排他性的。而复选框本身就没有排他性。
通用功能6:模拟点击
让软件自动点击按钮。
- click() :普通点击
- animateClick(毫秒) :动画点击
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
btn = QPushButton(window)
btn.setText("这是按钮")
btn.move(200, 200)
btn.pressed.connect(lambda: print("点击这个按钮"))
btn2 = QPushButton(window)
btn2.setText("按钮2")
def test():
# btn.click() # 没有任何提示
btn.animateClick(1000) # 动画点击,有个动画提示
btn2.pressed.connect(test)
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
通用功能7:设置有效区域
API:重写hitButton(QPoint);有效返回True,无效返回False
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys
# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)
# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮功能测试") # 标题
window.resize(500, 500) # 窗口的大小
window.move(400, 200) # 窗口初次显示的位置
# 只有hitButton事件返回True按钮才有效
# QPoint就是点击的按钮上的坐标
class Btn(QPushButton):
def hitButton(self, QPoint):
print(QPoint)
if QPoint.x() > self.width() / 2:
return True
else:
return False
# 经过上述改写,只有点击按钮的右半部分,才会触发槽函数
btn = Btn(window)
btn.setText("点击")
btn.move(200, 200)
btn.pressed.connect(lambda: print("按钮被点击"))
window.show() # 显示窗口,不然啥也没有
sys.exit(app.exec_())
通用功能8:可用信号
- pressed() :按钮被按下触发的信号
- releasd():鼠标释放;控件内松开鼠标、鼠标移出控件范围后
- clicked():控件内按下+控件内释放
- toggled():切换信号(一般是针对单选框或者复选框使用)