基于PYQT5中的QLabel标签类的扩展类(图片,动画、按纽,多选按纽,单选按纽)示例

因PYQT5的标签类QLabel可支持显示透明图象,GIF动画等,用此类扩展继承类,封装好继承类以实现低代码就可以完成实现用标签显示图片,动画,文字,模仿图形按纽等,同时扩展来代替按纽,多选按纽,单选按纽的功能,下面以QLabel作为基类编写其扩展子类QLabelEx类(用于显示图片,动画等基本功能),在以QLabelEx类为基类,扩展出以下4个子类(QLabel的孙类)

QLabelExLstImg: 继承QLabelEx类的扩展类,用于定时显示指定的图象序列,显示类似于GIF动画效果

QLabelExBtn: 继承QLabelEx类的扩展类,用于模仿图象按纽,移入移出单击控件时可以用不同的透明图象显示效果

QLabelExBtnCheck: 继承QLabelEx类的扩展类,用于模仿check多选图象按纽

QLabelExBtnRadio: 继承QLabelEx类的扩展类,用于模仿Radio单选图象按纽

示例运行效果如下:(注:代码中用到的1.png等图片请自行找几小透明图片改名到模块目前录中即可,博客中我上传这几个图片可截屏保存,对异型图片要想显示异型按纽效果需要用firwork软件处理成透明图片即可)

原计划封装GIF动画时,用缓冲方式,即先将要用的GIF文件全部加载到内存中,以后不用再在硬盘上读取文件了,但没有成功,只能采用要使用的时候现读取和加载指定文件,如有成功的可以评论区贴下代码,供大家学习。

测试QtLabelEx.py模块的主窗体代码如下:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import QMovie
from PyQt5.QtCore import QByteArray

from QtLabelEx import *    #导入自定义的标签扩展类
#测试标签扩展类的主窗体
class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('测试自定义继承QT的常用控件类')
        self.setGeometry(0, 0, 1920, 900)
        self.statusbar = self.statusBar()
        self.statusbar.showMessage('准备')
        self.setStatusTip('准备...')  
        self.qimage = QImage('1.jpg')   #底图
        self.initUI()
    def initUI(self):
        self.btn_Test=QPushButton('测试...',self)
        self.btn_Test.setGeometry(500,50,100,50)
        self.btn_Test.clicked.connect(self.test)
        font=QFont('宋体',9)
        font.setBold(True)
        font.setItalic(True)
        font.setUnderline(True)

        lst=['1.png','2.png','3.png','4.png']   #和模块文件同一目录的几个测试用小图片文件(最好用透明的PNG图)
                
        self.myLabel01 =  QLabelEx(self,50,50,150,150,'图象标签',0.8,font,QColor(255,0,0))
        self.myLabel01.SetAlign('DR')
        self.myLabel01.bDrawRect=True      #是否画出控件边框
        self.myLabel01.bChgCtlRect=False   #控件是否会自动变化其矩形区,以适应当前图象大小
        self.myLabel01.bZoomImgSize=True  #是否将图片放缩填满到控件的当前矩形区域
         
        self.myLabel01.LoadFile('1.gif')   #和模块文件同一目录的1个测试用GIF动画文件
        self.myLabel01.set_GifSpeed(100)
        self.myLabel01.DrawObjRect(QColor(0,0,255),2)

        self.myLabel02 =  QLabelExLstImg(self,250,50,150,150,'播放图象列表标签',0.8,font,QColor(255,0,0))
        self.myLabel02.setLstImg(lst,100)
        self.myLabel02.bDrawRect=False      #是否画出控件边框

        lstbtn=['btn_on.png','btn_on.png','btn_off.png','btn_disable.png']   #和模块文件同一目录的几个测试用小图片文件(最好用透明的PNG图)
        self.myLabel03 =  QLabelExBtn(self,50,250,202,73,'按纽标签')
        self.myLabel03.bDrawRect=False #不画外框
        self.myLabel03.setBtnImg(lstbtn)
        self.myLabel03.showMemImg(0)

        self.myLabel04 =  QLabelExBtnCheck(self,50,450,150,150,'多选按纽标签')
        self.myLabel05 =  QLabelExBtnCheck(self,250,450,150,150,'多选按纽标签')
        self.myLabel04.setBtnImg(lst)
        self.myLabel04.bZoomImgSize=False  #是否将图缩片放填满到控件的当前矩形区域
        self.myLabel04.showMemImg(0)
        self.myLabel05.setBtnImg(lst)
        self.myLabel05.bZoomImgSize=False  #是否将图片缩放填满到控件的当前矩形区域
        self.myLabel05.showMemImg(0)

        self.myLabel06 =  QLabelExBtnRadio(self,50,650,150,150,'单选按纽标签')
        self.myLabel06.setBtnGroup(0,0)  #仅用于QLabelExBtnRadio
        self.myLabel07 =  QLabelExBtnRadio(self,250,650,150,150,'单选按纽标签')
        self.myLabel07.setBtnGroup(0,1)  #仅用于QLabelExBtnRadio
        self.myLabel06.setBtnImg(lst)
        self.myLabel07.setBtnImg(lst)
        self.myLabel06.showMemImg(0)
        self.myLabel07.showMemImg(0)

        self.myLabel01.signal_Leftclicked.connect(self.lab_LeftClick) 
        self.myLabel01.signal_Rightclicked.connect(self.lab_RightClick) 
        self.myLabel01.signal_Midclicked.connect(self.lab_MidClick) 
        self.myLabel01.signal_LeftDropRelease.connect(self.lab_LeftDropClick) 

        self.myLabel02.signal_Leftclicked.connect(self.lab_LeftClick) 
        self.myLabel02.signal_Rightclicked.connect(self.lab_RightClick) 
        self.myLabel02.signal_Midclicked.connect(self.lab_MidClick) 
        self.myLabel02.signal_LeftDropRelease.connect(self.lab_LeftDropClick) 

        self.myLabel03.signal_Leftclicked.connect(self.lab_LeftClick) 
        self.myLabel03.signal_Rightclicked.connect(self.lab_RightClick) 
        self.myLabel03.signal_Midclicked.connect(self.lab_MidClick) 
        self.myLabel03.signal_LeftDropRelease.connect(self.lab_LeftDropClick) 

        self.myLabel04.signal_Leftclicked.connect(self.lab_LeftClick) 
        self.myLabel04.signal_Rightclicked.connect(self.lab_RightClick) 
        self.myLabel04.signal_Midclicked.connect(self.lab_MidClick) 
        self.myLabel04.signal_LeftDropRelease.connect(self.lab_LeftDropClick) 

        self.myLabel05.signal_Leftclicked.connect(self.lab_LeftClick) 
        self.myLabel05.signal_Rightclicked.connect(self.lab_RightClick) 
        self.myLabel05.signal_Midclicked.connect(self.lab_MidClick) 
        self.myLabel05.signal_LeftDropRelease.connect(self.lab_LeftDropClick) 
        
        self.myLabel06.signal_Leftclicked.connect(self.lab_LeftClick) 
        self.myLabel06.signal_Rightclicked.connect(self.lab_RightClick) 
        self.myLabel06.signal_Midclicked.connect(self.lab_MidClick) 
        self.myLabel06.signal_LeftDropRelease.connect(self.lab_LeftDropClick) 

        self.myLabel07.signal_Leftclicked.connect(self.lab_LeftClick) 
        self.myLabel07.signal_Rightclicked.connect(self.lab_RightClick) 
        self.myLabel07.signal_Midclicked.connect(self.lab_MidClick) 
        self.myLabel07.signal_LeftDropRelease.connect(self.lab_LeftDropClick) 

        self.myLabel06.signal_RadioBntSelected.connect(self.lab_RadioClick)  #仅用于QLabelExBtnRadio
        self.myLabel07.signal_RadioBntSelected.connect(self.lab_RadioClick)  #仅用于QLabelExBtnRadio

    #接收Radio标签按纽被单击时的信号   #仅用于QLabelExBtnRadio 
    def lab_RadioClick(self,groupID,obj):
        print('Radio标签按纽被单击反馈到主窗体的槽函数')
    
    #标签被单击时的信号槽函数
    def lab_LeftClick(self,obj):
        print(f'主窗体接收到了标签类发送来的信号signal_Leftclicked,鼠标点击相对控件内的坐标x={obj.startPoint.x()},y={obj.startPoint.y()},相对主窗体位置x={obj.startPoint.x()+obj.x()},y={obj.startPoint.y()+obj.y()}')
    def lab_RightClick(self,obj):
        print(f'主窗体接收到了标签类发送来的信号signal_Rightclicked,鼠标点击相对控件内的坐标x={obj.startPoint.x()},y={obj.startPoint.y()},相对主窗体位置x={obj.startPoint.x()+obj.x()},y={obj.startPoint.y()+obj.y()}')
    def lab_MidClick(self,obj):
        print(f'主窗体接收到了标签类发送来的信号signal_Midclicked,鼠标点击相对控件内的坐标x={obj.startPoint.x()},y={obj.startPoint.y()},相对主窗体位置x={obj.startPoint.x()+obj.x()},y={obj.startPoint.y()+obj.y()}')
    def lab_LeftDropClick(self,obj):
        print(f'主窗体接收到了标签类发送来的信号signal_LeftDropRelease,鼠标点击相对控件内的坐标x={obj.startPoint.x()},y={obj.startPoint.y()},相对主窗体位置x={obj.startPoint.x()+obj.x()},y={obj.startPoint.y()+obj.y()}')
    
    def mouseMoveEvent(self, event):
        #如果没有鼠标双击,执行
        globalPos = self.mapToGlobal(event.pos())
        x = globalPos.x()
        y = globalPos.y()
        self.text = '鼠标位置 {0:4d},{1:4d} '.format(x, y)
        self.update()

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        #painter.drawImage(QRect(10, 50, self.qimage.width(),self.qimage.height()), self.qimage)  #会拉伸的在指定矩形中绘出: 本行为1:1
        painter.drawImage(QRect(0,0, self.width(),self.height()-32), self.qimage)
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mr_LuoWei2009

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值