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():切换信号(一般是针对单选框或者复选框使用)

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/386.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 07 月 30 日
如果觉得我的文章对你有用,请随意赞赏