找回密码
 会员注册
查看: 28|回复: 0

pythonPyQt5中QAbstractButton基类的特性详细分析与实战应用

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
69864
发表于 2024-9-5 10:27:52 | 显示全部楼层 |阅读模式
✨✨欢迎大家来到景天科技苑✨✨🎈🎈养成好习惯,先赞后看哦~🎈🎈🏆作者简介:景天科技苑🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5和tkinter桌面开发,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战景天的主页:景天科技苑文章目录QAbstractButton1.介绍2.QAbstractButton的子类3.QAbstractButton案例4.QAbstractButton文本设置5.QAbstractButton图标设置6.QAbstractButton快捷键设置7.QAbstractButton自动重复8.QAbstractButton按钮状态9.QAbstractButton按钮排他性10.QAbstractButton通过代码模拟用户点击11.QAbstractButton设置按钮有效点击区域12.QAbstractButton自带的信号QAbstractButton1.介绍QAbstractButton是一个抽象类,无法直接实例化,但它提供了很多在PyQt中使用按钮时常用的功能和特性。开发人员可以通过继承QAbstractButton类并实现自定义行为来创建自己的按钮类。QAbstractButton是Qt中所有按钮类的基类,它提供了一些基本的按钮功能和属性。它是一个抽象类,不能直接实例化,而是通过继承它来创建具体的按钮类。通过继承QAbstractButton类,我们可以创建不同类型的按钮,如QPushButton、QCheckBox、QRadioButton等。这些具体的按钮类会继承并扩展QAbstractButton类的功能,以实现不同类型按钮的特定功能。在PyQt中,可以通过子类化QAbstractButton的抽象类来创建自定义的按钮类。通过子类化,可以根据需要扩展和重写QAbstractButton的功能,并实现自定义的按钮行为。当我们实例化一个QAbstractButton对象时,就会发生错误,原因就是C++的抽象类无法直接被实例化,而应该去子类化一个类,也就是写一个继承自QAbstractButton的类才可以。如下代码:btu=QAbstractButton(window)btu.setText('按钮')12运行结果:并且,继承QAbstractButton抽象类后,一定得重写paintEvent方法,不然也报错要实现抽象类,必须要实现抽象类中的所有抽象方法2.QAbstractButton的子类通过递归,查看QAbstractButton类的子类各子类介绍3.QAbstractButton案例#0.导入需要的包和模块fromPyQt5.Qtimport*importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件window.setWindowTitle("QAbstractButton")window.resize(500,500)#不能直接通过QAbstractButton抽象类来实例化对象,需要继承QAbstractButton,用子类来实例化对象classBtn(QAbstractButton):#实现抽象类,必须要实现抽象类中的所有抽象方法#此时必须重写QAbstractButton抽象类中的paintEvent抽象方法#绘制事件,绘制图像时触发defpaintEvent(self,evt):#print("绘制按钮")#绘制按钮上要展示的一个界面内容#1创建一个画家,画在什么地方,画在按钮上painter=QPainter(self)#2给画家一支笔#2.1创建一支笔,指定画的颜色,RGB,第二个参数是笔的粗细,粗细在画图的时候起作用,文字粗细不起作用pen=QPen(QColor(111,200,20),5)#2.2设置这个笔painter.setPen(pen)#3画家画,将文本信息添加上,画的位置,指定坐标位置#设置字体大小和字体类型painter.setFont(QFont('楷体',13))#drawText(self,x:int,y:int,width:int,height:int,flags:int,text:Optional[str])->Optional[QRect]painter.drawText(16,62,self.text())#4画椭圆drawEllipse(self,x:int,y:int,w:int,h:int)painter.drawEllipse(10,10,100,100)btn=Btn(window)btn.setText("景天科技苑")btn.resize(200,200)btn.move(100,100)#点击事件btn.clicked.connect(lambda:print("点击了这个按钮"))#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859运行点击按钮,点击事件也能触发一般我们创建按钮,不必使用这个抽象类,除非它给定的子类里面无法满足我们的需求,才需要我们用这个抽象类定制特定的需求4.QAbstractButton文本设置主要作用:用户点击按钮前,给用户的文本提示比如说确定取消…等API介绍实战案例:创建一个按钮,初始文本为1每点击一次,则让文本数字增加1代码展示:#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()classBtn(QPushButton):defmousePressEvent(self,QMouseEvent):num=int(self.text())num+=1self.setText(str(num))#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("点击按钮数字加1")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)btn=Btn(window)btn.setText("1")btn.move(100,100)#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536373839运行点击按钮,每点一次,按钮里面的数字加15.QAbstractButton图标设置我们可以给按钮自定义图标相关API介绍代码展示#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("按钮图标操作")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)btn=QPushButton(window)btn.setText("按钮")btn.move(100,100)#创建图标对象icon=QIcon("../imgs/python-gui.png")#设置图标btn.setIcon(icon)#图标居于按钮的文本左边#设置图标大小,QSize(w:int,h:int)#随着图标的变大,按钮的尺寸也会变大size=QSize(50,50)btn.setIconSize(size)#获取图标和图标尺寸print(btn.icon())print(btn.iconSize())#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536373839404142434445464748496.QAbstractButton快捷键设置按钮除了可以用鼠标点击之外,还可以通过指定的键盘的组合键,来触发按钮的点击事件,从而发射出相应信号,执行对应的槽函数代码展示#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("按钮快捷键")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)btn=QPushButton(window)btn.move(100,100)btn.pressed.connect(lambda:print("按钮被点击了"))#快捷键方式一,&后面是哪个字母,对应的快捷键就是Alt+字母,&后面要是有多个字母,第一个字母生效#注意:设置的快捷键不要与其他程序的快捷键冲突,不然可能不生效#btn.setText("q&qc")#快捷键设置方式二,通过setShortcut方法设置对应的快捷键btn.setText("按钮")btn.setShortcut("Alt+G")#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())12345678910111213141516171819202122232425262728293031323334353637383940414243按住alt+g,就会触发按钮按下7.QAbstractButton自动重复有时候,我们需要点下按钮之后,不松开,不断地向外界发射信号,从而触发对应的槽函数。这时候就用到了QAbstractButton的自动重复设置应用场景:比如说飞机大战游戏,长按发射子弹。直播软件长按送花等等,都需要持续性操作发射信号代码展示#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("自动重复")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)btn=QPushButton(window)btn.setText("发射")btn.move(100,100)#设置自动重复,默认情况下按钮是没有被设置自动重复的btn.setAutoRepeat(True)#设置初次检测延迟,单位毫秒btn.setAutoRepeatDelay(1000)#设置自动重复间隔,单位毫秒btn.setAutoRepeatInterval(500)#设置信号与槽btn.pressed.connect(lambda:print("发射子弹了"))#获取按钮是否设置了自动重复print("是否设置了自动重复",btn.autoRepeat())#获取自动重复间隔print("自动重复间隔",btn.autoRepeatInterval())#设置初次检测延迟,单位毫秒。防止初次点击就变成了重复。print("初次检测时间",btn.autoRepeatDelay())#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253运行,按住按钮不松开,看下自动重复触发8.QAbstractButton按钮状态PyQt5中的按钮是可以向外界展示他目前所处的状态的,供用户作参考判定按钮常见的几种状态:是否能用是否被按下是否被选中…API介绍代码展示#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()btn=QPushButton(window)btn.setText("按钮")#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的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按下后的背景颜色push_button.setStyleSheet("QPushButton:pressed{background-color:red;}")#把三个按钮,置为按下状态。相当于用户按下鼠标,还没松开push_button.setDown(True)radio_button.setDown(True)checkbox.setDown(True)#查看按钮是否被按下print(push_button.isDown())print(radio_button.isDown())print(checkbox.isDown())#设置按钮是否可以被选中,默认QPushButton是不可以被选中的,可以设置。单选和多选按钮默认可以被选中push_button.setCheckable(True)#查看按钮是否可以被选中print(push_button.isCheckable())print(radio_button.isCheckable())print(checkbox.isCheckable())#设置按钮被选中radio_button.setChecked(True)push_button.setChecked(True)checkbox.setChecked(True)#查看按钮是否被选中print(push_button.isChecked())print(radio_button.isChecked())print(checkbox.isChecked())#切换选中状态toggle()defcao():push_button.toggle()radio_button.toggle()checkbox.toggle()#push_button.setChecked(notpush_button.isChecked())#通过btn这个按钮切换三个按钮的选中状态btn.pressed.connect(cao)#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899运行点击左上角按钮,可以切换中间按钮的选中状态9.QAbstractButton按钮排他性如果同时存在多个按钮,而此时所有按钮又设置了排他性,则在同一时刻只能选中一个按钮API介绍默认情况下QRadioButton具有了可以被选中和排他性功能QCheckboxButton具有了可以被选中特性,不具有排他性功能QPushButton两者均不具备代码展示:#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("按钮排他性")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)#循环创建多个多选按钮foriinrange(0,3):btn=QCheckBox(window)btn.setText("btn"+str(i))btn.move(50*i,50*i)#设置排他性为Truebtn.setAutoExclusive(True)#查看是否设置了排他性print(btn.autoExclusive())#查看按钮是否可以被选中print(btn.isCheckable())#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())12345678910111213141516171819202122232425262728293031323334353637383940414243多选按钮,设置了排他性,每次只能选中一个按钮10.QAbstractButton通过代码模拟用户点击相关API介绍animateClick在模拟点击时,会显示点击的动画效果,click()模拟点击时,没有点击的动画效果#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("按钮模拟点击")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)btn=QPushButton(window)btn.move(100,100)btn.setText("点击")#设置点击信号与槽btn.clicked.connect(lambda:print("按钮被点击"))#使用代码,模拟用户点击按钮#btn.click()#动画点击,鼠标按下两秒后松开#animateClick在模拟点击时,会显示点击的动画效果btn.animateClick(2000)#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536373839404142434445可以看到,按钮被点击按下时的背景颜色变化11.QAbstractButton设置按钮有效点击区域按钮控件,一般用户点击按钮区域的任何一个点,都会触发点击事件有些需求,肯呢个会要求点击按钮的某些区域才会触发点击事件,此时该怎么办呢?此时就用到了设置有效点击区域相关API介绍代码展示#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("按钮有效区域")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)classBtn(QPushButton):#设置按钮有效区域的关键在于重写hitButton方法,该方法必须有个返回值True/False。当该方法返回True,就是有效区域,返回False就是无效区域#hitButton的参数point可以获取鼠标的参照按钮的实时坐标defhitButton(self,point):#print("当前鼠标点击坐标",point)#点击按钮右半部分有效#ifpoint.x()>self.width()/2:#returnTrue#returnFalse#通过给定的一个点坐标,计算与圆心的距离yuanxin_x=self.width()/2yuanxin_y=self.height()/2#实时点击鼠标的点坐标,通过hitButton的参数获得hit_x=point.x()hit_y=point.y()#((x1-x2)平方+(y1-y2)平方)开平方#半径小于宽度的一半的圆内点击有效importmathdistance=math.sqrt(math.pow(hit_x-yuanxin_x,2)+math.pow(hit_y-yuanxin_y,2))#点击的点距离圆心距离#print("点击的点距离圆心距离",distance)ifdistance
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 06:14 , Processed in 0.698989 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表