PyQt5学习笔记——QAbstractButton详解

QAbstractButton详解

一、描述

  • 所有按钮控件的基类
  • 提供按钮的通用功能

继承抽象类,实现相关方法,才可以使用这个类

import sys
from PyQt5.Qt import *

# 抽象类  使用需要进程 实现  必须实现抽象类所有的方法 重写!
class Btn(QAbstractButton):
    def  paintEvent(self,evt):
        print("绘制按钮")
        # 必须自行绘制按钮控件

        # 创建一个画家
        # 下面所画的一切图案都是在这张纸上面——按钮上面作图
        painter = QPainter(self)  # 这里的self相当于一张纸

        # 给画家一个笔
        # 创建一个笔  参数是传入颜色
        pen = QPen(QColor(111,200,20),10)

        # 设置这个笔
        painter.setPen(pen)

        # 画家画画  文本  前两个参数是位置参数
        painter.drawText(20,20,"五个亿")

        # 椭圆
        painter.drawEllipse(0,0,100,100)


if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("QAbstractButton")
    window.resize(500,500)

    btn = Btn(window)
    btn.setText("xxx")

    btn.resize(100,100)
    btn.pressed.connect(lambda :print("点击了这个函数"))

    window.show()

    sys.exit(app.exec_())

二、继承

QWidget

三、功能作用

3.1 提示文本

3.1.1 API
  • setText(str) 设置按钮提示文本
  • text() 获取按钮提示文本
3.1.2 应用场景

用户点击按钮前,给用户的文本提示:确定or取消

3.1.3 案例

在这里插入图片描述

测试代码:

import sys
from PyQt5.Qt import *


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("按钮的功能测试——抽象类")
    window.resize(500,500)

    btn = QPushButton(window)
    btn.setText("1")


    # 实现需求:每点击一次按钮,按钮中的文本数字加一
    def plus_one():
        print("加一")
        num = int(btn.text()) + 1
        btn.setText(str(num))

    btn.pressed.connect(plus_one)

    window.show()
    sys.exit(app.exec_())

3.2 图标相关

3.2.1 API
  • setIcon(QIcon(“resource/h1.jpg”)) 设置图标 相对路径 图标对象
  • setIconSize(QSize(w,h)) 设置图标大小
  • icon() 获取图标
  • iconSize() 获取图标大小
3.2.2 应用场景

用户点击按钮前,给用户的图标提示

3.2.3 案例

实现上述API

import sys
from PyQt5.Qt import *


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("图标操作")
    window.resize(500,500)

    btn = QPushButton(window)
    btn.setText("1")


    # 实现需求:每点击一次按钮,按钮中的文本数字加一
    def plus_one():
        print("加一")
        num = int(btn.text()) + 1
        btn.setText(str(num))


    btn.pressed.connect(plus_one)


    # 创建一个图标对象
    icon = QIcon("img.png")   # 传入相对路径
    btn.setIcon(icon)
  
    # 设置图标大小  传入QSize对象  宽  高
    size = QSize(50,50)
    btn.setIconSize(size)

    window.show()
    sys.exit(app.exec_())

3.3 设置快捷键

3.3.1 作用

通过指定的快捷键,触发按钮的点击

3.3.2 方式1

有提示文本的:如果提示文本包含&符号的,则QAbstractButton会自动创建快捷键

3.3.3 方式2

没有提示文本的:setShortcut(“Alt + G”)

测试代码:

import sys
from PyQt5.Qt import *


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("图标操作")
    window.resize(500,500)

    btn = QPushButton(window)
    btn.setText("1")


    # 实现需求:每点击一次按钮,按钮中的文本数字加一
    def plus_one():
        print("加一")
        num = int(btn.text()) + 1
        btn.setText(str(num))


    # btn.pressed.connect(plus_one)


    # 创建一个图标对象
    icon = QIcon("img.png")   # 传入相对路径
    btn.setIcon(icon)

    # 设置图标大小  传入QSize对象  宽  高
    size = QSize(50,50)
    btn.setIconSize(size)

    # 快捷键的设定

    btn.pressed.connect(lambda:print("按钮被点击了"))  # 重新连接一个槽函数
    # btn.setText("&abc")  # 有提示文本  在文本前面加上& 即可创建快捷键:ALT + A


    # 如果没有设置提示文本
    btn.setShortcut("Alt + a") # 里面传入快捷键字符串





    window.show()
    sys.exit(app.exec_())

3.4 自动重复

3.4.1 API
  • setAutoRepeat(bool) 设置自动重复
  • setAutoRepeatInterval(毫秒) 设置自动重复检测间隔
  • setAutoRepeatDelay(毫秒) 设置初次检测延迟

获取方法

  • autoRepeat() 获取是否自动重复
  • autoRepeatInterval() 获取自动重复检测间隔
  • autoRepeatDelay() 获取初次检测延迟
3.4.2 应用场景

当用户点击按钮时,想快速重复性响应时设置(发射子弹,一直触发事件)

3.4.3 案例

创建一个按钮,设置初始文本为1
在这里插入图片描述

测试代码:

import sys
from PyQt5.Qt import *


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("图标操作")
    window.resize(500,500)

    btn = QPushButton(window)
    btn.setText("1")


    # 实现需求:每点击一次按钮,按钮中的文本数字加一
    def plus_one():
        print("加一")
        num = int(btn.text()) + 1
        btn.setText(str(num))


    btn.pressed.connect(plus_one)
    # 创建一个图标对象
    icon = QIcon("img.png")   # 传入相对路径
    btn.setIcon(icon)

    # 设置图标大小  传入QSize对象  宽  高
    size = QSize(50,50)
    btn.setIconSize(size)

    # 快捷键的设定
    # btn.pressed.connect(lambda:print("按钮被点击了"))  # 重新连接一个槽函数
    # btn.setText("&abc")  # 有提示文本  在文本前面加上& 即可创建快捷键:ALT + A

    # 如果没有设置提示文本
    btn.setShortcut("Alt + a") # 里面传入快捷键字符串

    # 自动重复设置
    print(btn.autoRepeat())  # 查看是否可以自动重复

    btn.setAutoRepeat(True)  # 点击按钮  重复执行相应的事件
    btn.setAutoRepeatDelay(2000)  # 设置延迟 2000ms
    btn.setAutoRepeatInterval(1000)  # 设置自动重复检测间隔 每隔一秒加一
    window.show()
    sys.exit(app.exec_())

3.5 状态

3.5.1 API

在这里插入图片描述

3.5.2 应用场景

判断按钮的状态

3.5.3 案例

测试以上API

测试代码1:

import sys

from PyQt5.Qt import *

if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("按钮状态")
    window.resize(500,500)


    push_button = QPushButton(window)
    push_button.setText("这是QPushButton")
    push_button.move(100,100)

    radio_button = QRadioButton(window)
    radio_button.setText("这是一个radio")
    radio_button.move(100,150)

    checkbox = QCheckBox(window)
    checkbox.setText("这是一个checkbox")
    checkbox.move(100,200)

    # 按钮还可以设置按下之后的背景状态  红色
    push_button.setStyleSheet("QPushButton:pressed {background-color:red;}")



    # 将三个按钮都设置为按下状态
    push_button.setDown(True)
    radio_button.setDown(True)
    checkbox.setDown(True)


    window.show()
    sys.exit(app.exec_())



测试代码2:

import sys

from PyQt5.Qt import *

if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("按钮状态")
    window.resize(500,500)


    push_button = QPushButton(window)
    push_button.setText("这是QPushButton")
    push_button.move(100,100)

    radio_button = QRadioButton(window)
    radio_button.setText("这是一个radio")
    radio_button.move(100,150)

    checkbox = QCheckBox(window)
    checkbox.setText("这是一个checkbox")
    checkbox.move(100,200)

    # 按钮还可以设置按下之后的背景状态  红色
    push_button.setStyleSheet("QPushButton:pressed {background-color:red;}")

    # # 将三个按钮都设置为按下状态
    # push_button.setDown(True)
    # radio_button.setDown(True)
    # checkbox.setDown(True)

    # 打印这三个按钮是否可以被选中   第一种QPushButton不可以被选中
    print(push_button.isCheckable())
    print(radio_button.isCheckable())
    print(checkbox.isCheckable())

    # 将按钮设置为可以被选中
    push_button.setCheckable(True)
    print(push_button.isCheckable())


    # 将三种按钮全部设置为选中状态d
    push_button.setChecked(True)
    radio_button.setChecked(True)
    checkbox.setChecked(True)

    # 查看这三种按钮是否为被选中的状态
    print(push_button.isChecked())
    print(radio_button.isChecked())
    print(checkbox.isChecked())

    # toggle 函数是切换状态: 选中或者被选中
    def cao():
        push_button.toggle()
        radio_button.toggle()
        checkbox.toggle()


    btn = QPushButton(window)
    btn.setText("点击")
    # 点击这个按钮   切换其他三个按钮的状态
    btn.pressed.connect(cao)

    window.show()
    sys.exit(app.exec_())



3.6 排他性

3.6.1 概念

如果同时存在多个按钮,而此时所有的按钮又设置了排他性,
则在同一时刻只可以选中一个按钮

3.6.2 API

在这里插入图片描述

3.6.3 应用场景

设定按钮组中的按钮,单选特性

3.6.4 案例

测试以上API

测试代码:

import sys
from PyQt5.Qt import *


if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("排他性测试")
    window.resize(500,500)

    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_())

3.7 点击

3.7.1 API
  • click() 普通点击
  • animateClick(ms) 动画点击
3.7.2 应用场景
  • 使用代码触发按钮点击
  • 会发射相关信号
3.7.3 案例

测试以上API

import sys
from PyQt5.Qt import *


if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("按钮点击")
    window.resize(500,500)

    # 模拟按钮点击
    btn = QPushButton(window)
    btn.setText("这个是按钮")
    btn.move(200,200)
    btn.pressed.connect(lambda:print("点击了这个按钮"))


    # 模拟用户的点击
    btn.click()  # 可以自动点击按钮  并且触发槽函数

    # 模拟动画点击
    btn.animateClick(2000)


    window.show()
    sys.exit(app.exec_())

3.8 设置有效区域

3.8.1 API

重写hitButton(QPoint):有效返回True,无效返回False

3.8.2 应用场景

指定用户点击某个区域有效,而不是单一的矩形

3.8.3 案例

设置只点击按钮中心的圆形区域才会有效

import sys
from PyQt5.Qt import *
import math

if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = QWidget()
    window.setWindowTitle("按钮点击")
    window.resize(500,500)

    # 模拟按钮点击
    # btn = QPushButton(window)
    # btn.setText("这个是按钮")
    # btn.move(200,200)
    # btn.pressed.connect(lambda:print("点击了这个按钮"))


    # 模拟用户的点击
    # btn.click()  # 可以自动点击按钮  并且触发槽函数
    #
    # # 模拟动画点击
    # btn.animateClick(2000)


    class Btn(QPushButton):

        # 点击按钮
        def hitButton(self, point):
            # print(point)
            #
            # if point.x() > self.width() / 2:
            #     return True
            #
            # return False


            # 点击在一个圆中  触发槽函数
            # 通过给定一个点的坐标,计算与圆心的距离
            yuanxin_x = self.width() / 2
            yuanxin_y = self.height() / 2

            hit_x = point.x()
            hit_y = point.y()

            distance = math.sqrt(math.pow(hit_x - yuanxin_x,2) + math.pow(hit_y - yuanxin_y,2))

            if distance < self.width() / 2:
                return True

            return False

        # 画一个内切圆
        def paintEvent(self,QPaintEvent):
            super().paintEvent(QPaintEvent)


            painter = QPainter(self)
            painter.setPen(QPen(QColor(100,150,200),6))
            painter.drawEllipse(self.rect())



    btn = Btn(window)
    btn.setText("点击")
    btn.move(100,100)
    btn.resize(200,200)

    # 只有按钮点击在指定的区域 才会触发槽函数
    btn.pressed.connect(lambda: print("按钮被点击了"))  # 判定有效才会触发槽函数




    window.show()
    sys.exit(app.exec_())

四、信号

在这里插入图片描述

测试代码 上面已经写过

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少写代码少看论文多多睡觉

求打赏,求关注,求点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值