中文企业网站模板下载/百度账号

中文企业网站模板下载,百度账号,网站上传照片 传不上去,做h5的图片网站标签是界面设计中最常用的控件,本文演示了如何基于PySide6的QLabex控件类扩展定义QLabelEX类,以实现更少的编码完成各种图像、彩色文本、动画的加载和显示,丰富界面显示 本示例演示了QLabel和其扩展类QLabelEx分别显示文本、图像、动画的使用…

标签是界面设计中最常用的控件,本文演示了如何基于PySide6的QLabex控件类扩展定义QLabelEX类,以实现更少的编码完成各种图像、彩色文本、动画的加载和显示,丰富界面显示

本示例演示了QLabel和其扩展类QLabelEx分别显示文本、图像、动画的使用方法

示例主窗口模块代码如下:


# -*- coding:utf-8 -*-
import sys
from PySide6 import *
from PySide6.QtWidgets import *
from PySide6.QtCore import *
#from PySide6.QtGui import *      #如果运行时没有任何界面调出,也不报错,请屏蔽此行,原因不详
import PySide6.QtChartsfrom PySide6.QtCore import Signal, QEvent,Property, QSize
from PySide6.QtCore import (QDateTime, QFile,QDir, QLibraryInfo, QSysInfo, Qt,QTimer,Slot,  QAbstractTableModel, QModelIndex,QPoint,QPointF,QStandardPaths, QUrl, QIODevice, QRectF,qFatal,qWarning,qVersion)
from PySide6.QtGui import (QCursor,QIcon,QImage,QPicture,QDesktopServices, QGuiApplication,QKeySequence, QShortcut, QStandardItem,QStandardItemModel)
from PySide6.QtGui import (QPen,QBrush,QColor,QFont, QPainter,QGradient,QMatrix4x4,QPlatformSurfaceEvent, QSurface, QWindow,QSurfaceFormat)
from PySide6.QtGui import (QRhi, QRhiBuffer,QPixmap,QAction,QWheelEvent,QRhiDepthStencilClearValue,QRhiGraphicsPipeline, QRhiNullInitParams,QRhiGles2InitParams, QRhiRenderBuffer,QRhiSampler, QRhiShaderResourceBinding,QRhiShaderStage, QRhiTexture,QMovie,QRhiVertexInputAttribute, QRhiVertexInputBinding,QRhiVertexInputLayout, QRhiViewport, QShader)
from PySide6.QtWidgets import (QApplication, QDialog,QWidget, QFileDialog, QMainWindow, QMessageBox)
from PySide6.QtWidgets import (QCheckBox, QComboBox,QCommandLinkButton, QDateTimeEdit, QDial,QDialog, QDialogButtonBox, QFileSystemModel,QGridLayout, QGroupBox, QHBoxLayout, QLabel,QLineEdit, QListView, QMenu, QPlainTextEdit,QProgressBar, QPushButton, QRadioButton,QScrollBar, QSizePolicy, QSlider, QSpinBox,QStyleFactory, QTableWidget, QTabWidget,QTextBrowser, QTextEdit, QToolBox, QToolButton,QTreeView, QVBoxLayout)
from QLabelEx import * #导入标签扩展类################################################################################
class mainWindow(QWidget):def __init__(self, parent=None):super(mainWindow, self).__init__(parent)self.resize(500, 800)self.setWindowTitle("PySide QLabel及扩展标签类QLabelEx的几种用法示例")# 全局布局(1个):水平wlayout = QHBoxLayout()# 局部布局(2个):竖直self.layout1 = QVBoxLayout()self.layout1.setSpacing(10)self.layout2 = QVBoxLayout()self.layout2.setSpacing(10)'''配置'''# 配置文本内容label1 = QLabel(self)label1.setText("本列为原始PySide QLabel示例")# 设置图片label2 = QLabel(self)label2.setPixmap(QPixmap("2.png"))# 限制图片大小,并允许图片自适应限制label3 = QLabel(self)label3.setPixmap(QPixmap("2.png"))label3.setFixedSize(40, 40)  # 限制图片大小label3.setScaledContents(True)  # 图片自适应限制# 设置居中对齐label4 = QLabel(self)label4.setText("设置居中对齐")label4.setAlignment(Qt.AlignmentFlag.AlignCenter)# 设置缩进label5 = QLabel(self)label5.setText("设置缩进")label5.setIndent(20)# 设置边距;setStyleSheet("border:边框粗细 实体 颜色;")label6 = QLabel(self)label6.setText('文本边框显示,边框2倍框,实体边框,红色')label6.setStyleSheet("border:2px solid red;")# 文本内容距离边框的间距label7 = QLabel(self)label7.setText('文本内容距离边框的间距')label7.setStyleSheet("border:1px solid;")label7.setMargin(10)# 设置文本格式label8 = QLabel(self)label8.setText('设置文本格式为超文本')label8.setTextFormat(Qt.TextFormat.RichText)# 允许文本被编辑和选中label9 = QLabel(self)label9.setText('允许文本被编辑和选中')label9.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse | Qt.TextInteractionFlag.TextEditable)# 打开外部链接(可选择交互)label10 = QLabel(self)label10.setText("<a href='www.baidu.com' target='_blank'>超链接:百度</a>")label10.setOpenExternalLinks(True)  # 允许打开链接# 画图案,drawEllipse(第1、2个参数是矩形的坐标原点,第3、4个参数是矩形的长和宽)label11 = QLabel(self)pic = QPicture()  # 图片对象painter = QPainter(pic)  # 画家对象painter.setBrush(QBrush(QColor(100, 120, 155)))  # 设置画刷painter.drawEllipse(0, 0, 50, 100)label11.setPicture(pic)# 展示动图label12 = QLabel(self)movie = QMovie("1.gif")label12.setMovie(movie)label12.setFixedSize(100, 100)  # 限制图片大小label12.setScaledContents(True)  # 图片自适应限制movie.start()  # !! 开始动画movie.setSpeed(100)  # 设置动画的速度100%# movie.stop()  # 关闭动画# 设计标签并清空label13 = QLabel(self)label13.setText('清空')label13.clear()# 字体label14 = QLabel(self)label14.setText('字体加粗,14号,黑体')label14.setFont(QFont('Bold', 14, QFont.Black))'''布局'''self.layout1.addWidget(label1)self.layout1.addWidget(label2)self.layout1.addWidget(label3)self.layout1.addWidget(label4)self.layout1.addWidget(label5)self.layout1.addWidget(label6)self.layout1.addWidget(label7)self.layout1.addWidget(label8)self.layout1.addWidget(label9)self.layout1.addWidget(label10)self.layout1.addWidget(label11)self.layout1.addWidget(label12)self.layout1.addWidget(label13)self.layout1.addWidget(label14)# 文本类扩展标签labelEx01 = QLabelEx(self,0,0,0,0,'本列为原始PySide QLabel类继承扩展QLabelEx类示例',0.5,QFont('黑体',18),QColor(255,0,0))self.layout2.addWidget(labelEx01)# 图像类扩展标签labelEx02 = QLabelEx(self,0,0,0,0,'图片扩展标签02')    #默认是自动缩放装满标签矩形框:默认左中对齐labelEx02.LoadFile("2.png")self.layout2.addWidget(labelEx02)labelEx03 = QLabelEx(self,0,0,0,0,'图片扩展标签03')    #默认是自动缩放装满标签矩形框labelEx03.bZoomImgSize=False  #原图大小不缩放labelEx03.bDrawRect=True      #画出控件矩形区域线框labelEx03.SetAlign('DR')      #图片右下角对齐显示labelEx03.LoadFile("2.png")self.layout2.addWidget(labelEx03)# 动画类扩展标签labelEx04 = QLabelEx(self,0,0,0,0,'动画扩展标签04')    #默认是自动缩放装满标签矩形框labelEx04.LoadFile("1.gif")self.layout2.addWidget(labelEx04)labelEx05 = QLabelEx(self,0,0,0,0,'动画扩展标签05')    #默认是自动缩放装满标签矩形框labelEx05.bZoomImgSize=False  #原图大小不进行缩放labelEx05.bDrawRect=True      #画出控件矩形区域线框labelEx05.SetAlign('CC')      #动画上下左右居中显示labelEx05.LoadFile("2.gif")self.layout2.addWidget(labelEx05)# 准备2个子窗体部件,分别定义上面准备布局的2个区域hwg = QWidget()vwg = QWidget()hwg.setLayout(self.layout1)vwg.setLayout(self.layout2)# 四个部件加至全局布局(沿水平方向,竖向7等分平区为8块,水平占3等份网格占3等份,其他占1等份)wlayout.addWidget(hwg)wlayout.addWidget(vwg)# 窗体本体设置全局布局self.setLayout(wlayout)if __name__ == '__main__':app = QApplication(sys.argv)mainwin = mainWindow()mainwin.show()sys.exit(app.exec_())

自定义标签扩展类模块QLabeEx.py代码如下

#模块名:QLabelEx.py:将PySide6的标签、编辑框、按纽等常规控件类再扩展对应的子类,更方便快速使用
#包含类名: QLabelEx: 继承QtLable类的扩展类:支持低代码显示图片,动画等功能
#          QLabelExLstImg: 继承QLabelEx类的扩展类,用于可以定时显示指定的图象列表
#          QLabelExBtn: 继承QLabelEx类的扩展类,用于模仿图象按纽,移入移出单击控件时可以用不同的透明图象显示
#          QLabelExBtnCheck: 继承QLabelEx类的扩展类,用于模仿check多选图象按纽
#           QLabelExBtnRadio: 继承QLabelEx类的扩展类,用于模仿Radio单选图象按纽
#           : 
import os,sys,time,math,copy,random 
"""已不需要PyQt5,转为PySide6支持了
import PyQt5
from PyQt5 import *
from PyQt5 import QtCore   
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtGui import QMovie
from PyQt5.QtCore import QByteArray
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest
"""
from PySide6 import *
from PySide6.QtWidgets import *
from PySide6.QtCore import *
#from PySide6.QtGui import *      #如果运行时没有任何界面调出,也不报错,请屏蔽此行,原因不详
import PySide6.QtChartsfrom PySide6.QtCore import Signal, QEvent,Property, QSize
from PySide6.QtCore import (QDateTime, QFile,QDir, QLibraryInfo, QSysInfo, Qt,QTimer,Slot,  QAbstractTableModel, QModelIndex,QPoint,QPointF,QStandardPaths, QUrl, QIODevice, QRectF,qFatal,qWarning,qVersion)
from PySide6.QtGui import (QCursor,QIcon,QImage,QPicture,QDesktopServices, QGuiApplication,QKeySequence, QShortcut, QStandardItem,QStandardItemModel)
from PySide6.QtGui import (QPen,QBrush,QColor,QFont,QPalette,QPainter,QGradient,QMatrix4x4,QPlatformSurfaceEvent, QSurface, QWindow,QSurfaceFormat)
from PySide6.QtGui import (QRhi, QRhiBuffer,QPixmap,QAction,QWheelEvent,QRhiDepthStencilClearValue,QRhiGraphicsPipeline, QRhiNullInitParams,QRhiGles2InitParams, QRhiRenderBuffer,QRhiSampler, QRhiShaderResourceBinding,QRhiShaderStage, QRhiTexture,QMovie,QRhiVertexInputAttribute, QRhiVertexInputBinding,QRhiVertexInputLayout, QRhiViewport, QShader)
from PySide6.QtWidgets import (QApplication, QDialog,QWidget, QFileDialog, QMainWindow, QMessageBox)
from PySide6.QtWidgets import (QCheckBox, QComboBox,QCommandLinkButton, QDateTimeEdit, QDial,QDialog, QDialogButtonBox, QFileSystemModel,QGridLayout, QGroupBox, QHBoxLayout, QLabel,QLineEdit, QListView, QMenu, QPlainTextEdit,QProgressBar, QPushButton, QRadioButton,QScrollBar, QSizePolicy, QSlider, QSpinBox,QStyleFactory, QTableWidget, QTabWidget,QTextBrowser, QTextEdit, QToolBox, QToolButton,QTreeView, QVBoxLayout)lst_ImgExName=['BMP','JPG','JPEG','PNG','TIF','TIFF','TGA','WMF','SVG','HEIF','RAW','WEBP']
lst_MovExName=['GIF','AVI','MPEG','MP4','MOV','MKV','WMV','FLV','RMVB','RM','RAM']
lst_AlignType=['TL','TC','TR','CL','CC','CR','DL','DC','DR']
#########################################################################################################################
#重载标签类,标签可透明显示图像,用于在窗体上加载小分部图像
class QLabelEx(QLabel):  objcount=0   # signal_Leftclicked = Signal(object)        #自定信号,标签被左键单击,传回参数:控件对象本身signal_Rightclicked = Signal(object)       #自定信号,标签被右键单击,传回参数:控件对象本身signal_Midclicked = Signal(object)        #自定信号,标签被中键单击,传回参数:控件对象本身signal_LeftDropRelease = Signal(object)    #自定信号,标签被左键拖动后释放,传回参数:控件对象本身#初始化对角需传递的参数为  父类,创建矩形,内容,     控件透明度      字体                     字体颜色           背景颜色                    def __init__(self,parent=None,x=0,y=0,w=0,h=0,text='',transt=1.0,font=QFont('宋体', 11),fcolor=QColor(0,0,0)):  super(QLabelEx, self).__init__(parent)self.type='TXT'   #标签控件的类型,'TXT'=纯文本标签,‘IMG'=可显示图片标签 'MOV':可播放动画标签self.setGeometry(x,y,w,h)self.ctlRect=QRect(x,y,w,h)     #控件的矩形区域self.imgRect=QRect()            #如果控件加载了图象或视频自身尺寸的矩形区域self.bDrawRect = False          #是否在标签控件外边画出矩形框        self.rectCol=QColor(255,0,0)    #画矩形边框的颜色self.rectPenWidth=2             #画矩形边框的线宽度self.bChgCtlRect=False          #如果self.ctlRect不能满足文字、图象的矩形区域时,是否允许控件变化其矩形来适应文字或图象要求的矩形区域self.move_Flag = False           #标签控件是否可以主窗体上拖动:对窗体元素,应设置为Falseself.bZoomImgSize=True          #控件的矩形区同图象的矩形区不相符时,是否允许图象或视频自动缩放以适应控件矩形区self.setScaledContents(self.bZoomImgSize)  # 设置标签的图片,设置True时图片自适应控件,为False时,只显示控件范围图片self.setAutoFillBackground(False) #不允许自动填充背景底色self.text=text       #标签是文本类型时显示的内容self.drawText=text   #标签是图片或视频类型时显示的内容self.alignFlags=Qt.AlignTop | Qt.AlignLeft   #对齐方式self.bDrawTxt = False   #显示图片的同时,是否将self.drawText画到图象上self.fontCol=fcolor   #字体颜色self.bkCol=QColor(255,255,255)     #如设置不透明时的标签背景颜色self.setFont(font)palette = QPalette()palette.setColor(QPalette.ColorRole.WindowText, self.fontCol) #设置字体颜色self.setPalette(palette)self.SetTransparent(transt)             #设置控件的透明度,1=不透明,0=完全透明self.setText(text)self.global_X=self.gobal_Y=0               #标签相对屏幕左上点(0,0)的坐标self.startPoint=QPoint()                    #鼠标在标签控件上压下开始的坐标点self.endPoint=QPoint()                      #鼠标在标签控件上压下结束时的坐标点self.mouse_X=self.mouse_Y=0                #鼠标在标签控件上相对标签控件范围的坐标self.origin_x=self.origin_y=0self.globalmouse_X=self.globalmouse_Y=0   #鼠标在标签控件上相对屏幕左上点(0,0)的坐标self.oldPos=QPoint()                       #移动前标签控件的位置self.curImgfilename=''self.curMovFileName=''self.curData=None     #当标签是加载的图片或动画时,将文件同容加载到内存中再显示,避免频繁读写文件self.image=QImage()self.curRotAngle=0.0 #图片当前旋转角度(角度,非弧度,顺时针为正)self.gifSpeed=200  #当前要播放的GIF动画的速度self.drawtxtX=self.drawtxtY=0#如要要不透明的标签,设置标签背景色def setBkCol(self,bkcol=QColor(255,255,255)):self.bkCol=bkcolpalette = QPalette()self.setAutoFillBackground(True)          palette.setColor(QPalette.ColorRole.Window, self.bkCol)self.setPalette(palette)#设置标签中的文字/图片/GIF动画对齐方式Qt.AlignLeft:左对齐Qt.AlignRight:右对齐 Qt.AlignTop:顶部对齐Qt.AlignBottom:底部对齐Qt.AlignHCenter:水平居中Qt.AlignVCenter:垂直居中Qt.AlignCenter:同时水平和垂直居中def SetAlign(self,at='TL'):  #at=at.upper()self.alignFlags=Qt.AlignTop | Qt.AlignLeftif(at=='TL'): self.alignFlags=Qt.AlignTop | Qt.AlignLeftelif(at=='TC'): self.alignFlags=Qt.AlignTop | Qt.AlignHCenterelif(at=='TR'): self.alignFlags=Qt.AlignTop | Qt.AlignRightelif(at=='CL'): self.alignFlags=Qt.AlignVCenter | Qt.AlignLeftelif(at=='CC'): self.alignFlags=Qt.AlignVCenter | Qt.AlignHCenterelif(at=='CR'): self.alignFlags=Qt.AlignVCenter | Qt.AlignRightelif(at=='DL'): self.alignFlags=Qt.AlignBottom | Qt.AlignLeftelif(at=='DC'): self.alignFlags=Qt.AlignBottom | Qt.AlignHCenterelif(at=='DR'): self.alignFlags=Qt.AlignBottom | Qt.AlignRightelse:self.alignFlags=Qt.AlignVCenter | Qt.AlignLeftself.setAlignment(self.alignFlags)self.setText(self.text)  #有时并没有出现对齐效果,只能采用先清除再重加载的方式#旋转控件中的图片一指定的角度:角度为正东向,向顺时针旋转的角度为正,反之为负(非弧度)def RotateImg(self,angle): if(self.type=='IMG' and self.curData!=None):transform = QTransform()  transform.rotate(angle)     self.image=self.image.transformed(transform);             self.setPixmap(QPixmap.fromImage(self.image))  # 显示图片到Qlabel控件if(self.bChgCtlRect):   #为真时,旋转后同时调整控件大小self.resize(self.image.width(),self.image.height())#设置标签控件在加载图片时,控件尺寸同图片尺寸不符时,是否允许控件调整自身的矩形区域,以适应1:1的图象显示def ObjToImgSize(self):self.setScaledContents(self.bZoomImgSize)  #不允许自适应控件,只1:1显示到控件中,同时调整控件大小if(self.bChgCtlRect):   #只有先设置此属性为真时,才允许变化控件尺寸if(self.curData!=None):  image= QImage.fromData(self.curData)self.resize(image.width(),image.height()) #用下行后用设置参数中的矩形,用本行就是图片本身的尺寸self.ctlRect=QRect(self.x(),self.y(),self.width(),self.height())#设置标签加载的文件名称,可以是图片也可以是动画GIF或视频def LoadFile(self,filename=''):if(os.path.exists(filename)):file_extension = str(filename.split(".")[-1]).upper()bOK=Falsefor exname in lst_ImgExName:if file_extension == exname:self.type='IMG'bOK=Truebreakfor exname in lst_MovExName:if file_extension == exname:self.type='MOV'bOK=Truebreakif (bOK):with open(filename, 'rb') as f:self.curData = f.read()self.image= QImage.fromData(self.curData)    self.curMovFileName=filenameself.RefreshLable()else:print(f'没有找到对应扩展名: {file_extension} 的分类')self.type='TXT'self.ReshowText(self.text)self.ObjToImgSize()else:self.type='TXT'self.ReshowText(self.text)self.RefreshLable()  #清除图象,重新显示标签的文本def ReshowText(self,txt):self.text=txtself.clear()self.type='TXT'self.setText(txt)#设置显示图片的同时,画到标签控件上的文本,传入文本为空时,同标签控件初始化时的字符串一致,图形模式下,不调用此函数,默认不会绘出文本def setDrawText(self,txt,x=0,y=0):self.bDrawTxt=Trueif(len(txt)==0):self.drawText=self.textelse:self.drawText=txtself.drawtxtX=xself.drawtxtY=y#重新显示标签(在用了LoadFile后)def RefreshLable(self):    #如果图片被调整乱了,且不想要控件尺寸同图片尺寸self.setScaledContents(self.bZoomImgSize)  #不允许自适应控件,只1:1显示到控件中,同时调整控件大小if(self.type=='IMG'):self.image= QImage.fromData(self.curData)self.setPixmap(QPixmap.fromImage(self.image))  # 显示图片到Qlabel控件self.imgRect=QRect(self.x(),self.y(),self.image.width(),self.image.height())if(self.bChgCtlRect):self.resize(self.image.width(),self.image.height()) #用下行后用设置参数中的矩形,用本行就是图片本身的尺寸             elif(self.type=='MOV'):"""#用内存文件来播放GIF没成功??#从bytes创建一个QBuffer对象buffer=QBuffer()buffer.open(QBuffer.ReadOnly)buffer.write(self.curData)#self.movie = QMovie(self)#self.movie.setDevice(QByteArray(self.curData))# 使用QMovie来播放GIF#self.movie = QMovie(buffer)#self.movie.setSpeed(10)# 将movie应用到label上self.setMovie(self.movie)self.total_frame = self.movie.frameCount()self.gifSpeed=self.movie.speed()print(f'当前GIF文件=’{self.curMovFileName}‘,总帧数={self.total_frame},默认正常播放速度={self.gifSpeed}')self.set_GifSpeed(2.0)   #设置播放动画GIF的整速度:方法接受的是每1000毫秒播放的帧数比例,如是1:表示,一秒显示全部帧数,0.5表示一秒显示半数的帧数。self.movie.start()#self.setLabelLayer(True)"""self.movie = QMovie(self.curMovFileName)# 将movie应用到label上self.setMovie(self.movie)self.total_frame = self.movie.frameCount()self.gifSpeed=self.movie.speed()#print(f'当前GIF文件=’{self.curMovFileName}‘,总帧数={self.total_frame},默认正常播放速度={self.gifSpeed}')self.set_GifSpeed(self.gifSpeed)   #设置播放动画GIF的整速度:方法接受的是每1000毫秒播放的帧数比例,如是1:表示,一秒显示全部帧数,0.5表示一秒显示半数的帧数。self.movie.start()#"""else:    #self.type=='TXT'pass #设置播放GIF动画的速度:  interval值哦本准备播放GIF的默认播放速度的倍数,如当前GIF默认播放速度为100def set_GifSpeed(self,interval=100.0):self.gifSpeed=intervalif(self.type=='MOV' and self.movie!=None):self.movie.setSpeed(interval)  # 设置播放速度#设置标签控件的透明程度:对文字及图片均有效def SetTransparent(self,trans):if trans>1:trans=1elif trans<0:trans=0self.Transparent=transopacity_effect = QGraphicsOpacityEffect(parent=self)opacity_effect.setOpacity(trans)  # 设置透明度self.setGraphicsEffect(opacity_effect)  # 将透明度效果应用到标签上#self.setWindowOpacity(self.Transparent)#设置本标签对象是在最上方还是在最下方    def setLabelLayer(self,bTop=True):if(bTop):self.raise_()else:self.lower()#设置标签显示的文本的字体def setTextFont(self,fontname='宋体',fontsize=11,bBold=False,bItalic=False,bUnderline=False):font = QFont()font.setFamily(fontname)       # 设置字体名称font.setPointSize(fontsize)    # 设置字体大小font.setBold(bBold)            # 设置字体加粗font.setItalic(False)font.setUnderline(False)self.setFont(font)#设置标签显示的文本的字体def setTextCol(self,fcol=QColor(0,0,0)):self.setStyleSheet(f"QLabel {{ color: {fcol.name()}; }}")#设置标签显示的文本的字体def setTextBkCol(self,bkcol=QColor(255,255,255)):if( not self.bTransparent):   #对非透明模式才支持设置标签背景颜色self.setAutoFillBackground(True)  # 确保背景自动填充palette = self.palette()palette.setColor(QPalette.ColorRole.Window, bkcol)  self.setPalette(palette)#得到标签矩形中心位置 def getObjRect(self):size = self.geometry()self.centerX=size.x()+size.width()/2self.centerY=size.y()+size.height()/2return size.x(),size.y(),size.width(),size.height()#鼠标按下事件重载   def mousePressEvent(self, event):  self.startPoint=event.pos()self.oldPos=QPoint(event.globalX(),event.globalY())                         # 核心部分: 当鼠标点击是左键 并且 在top控件内点击时候触发 if (event.button() == Qt.LeftButton and self.move_Flag):    #and self.top.underMouse():self.setCursor(Qt.OpenHandCursor)    #移动时设置成手型光标# 但判断条件满足时候, 把拖动标识位设定为真#self.move_Flag = Trueself.globalmouse_X = event.globalX()self.globalmouse_Y = event.globalY()# 获取窗体当前坐标self.origin_x = self.x()self.origin_y = self.y()#鼠标移动事件重载          def mouseMoveEvent(self, event):  # 拖动标识位设定为真时, 进入移动事件if self.move_Flag:# 计算鼠标移动的x,y位移move_x = event.globalX() - self.globalmouse_Xmove_y = event.globalY() - self.globalmouse_Y# 计算窗体更新后的坐标:更新后的坐标 = 原本的坐标 + 鼠标的位移dest_x = self.origin_x + move_xdest_y = self.origin_y + move_y# 移动本标签控件size = self.geometry()self.move(dest_x, dest_y)self.ctlRect=QRect(self.x(),self.y(),self.width(),self.height())self.setLabelLayer(True)    #拖动的标签控件角色在最顶端显示# 鼠标左键释放        def mouseReleaseEvent(self, event):self.endPoint=event.pos()newPos=QPoint(event.globalX(),event.globalY())  if (event.button() == Qt.LeftButton and self.move_Flag): self.setCursor(Qt.ArrowCursor) # 设定鼠标为普通状态: 箭头if(self.move_Flag==False):   #非对象拖动状态,鼠标在控件区域移动一位置if(abs(self.endPoint.x()-self.startPoint.x())<2 and abs(self.endPoint.y()-self.startPoint.y())<2 ):  #判断是否单击if(event.button() == Qt.LeftButton):print('非拖动状态下:是左键单击不是拖动')self.signal_Leftclicked.emit(self)elif(event.button() == Qt.RightButton):print('非拖动状态下:是右键单击不是拖动')self.signal_Rightclicked.emit(self)elif(event.button() == Qt.MidButton):print('非拖动状态下:是中键单击不是拖动')self.signal_Midclicked.emit(self)else:print('非拖动状态下,鼠标在控件上移动了一位置')else:   #拖动对象状态,除非一点也没拖动,否则不对单位处理if(abs(self.oldPos.x()-newPos.x())<2 and abs(self.oldPos.y()-newPos.y())<2 ):print('虽是拖动状态但是并没拖动对象')if(event.button() == Qt.LeftButton):print('拖动状态下:是左键单击不是拖动')self.signal_Leftclicked.emit(self)elif(event.button() == Qt.RightButton):print('拖动状态下:是右键单击不是拖动')self.signal_Rightclicked.emit(self)elif(event.button() == Qt.MidButton):print('拖动状态下:是中键单击不是拖动')self.signal_Midclicked.emit(self)else:   #拖动对象移动了位置 print('拖动状态下:左键拖动控件移动了位置')self.signal_LeftDropRelease.emit(self)#重载绘图函数:def paintEvent(self, event):if (self.bDrawRect):  #标签控件是否绘制边框架self.DrawObjRect(self.rectCol,self.rectPenWidth)   #为控件画出外边框if(self.bDrawTxt): #是否在标签控件上画出文本pen = QPen()                    # 创建画笔对象painter = QPainter(self)        # 此QPainter只能在paintEvent中定义,不能定义成类的self成员对象,也不能在其地方(如其他窗口,线程中)定义,否则没有绘画功能显示#绘制pen.setColor(self.fontCol)                 painter.drawText(self.drawtxtX,self.drawtxtY,self.width(),self.height(),self.alignFlags,self.drawText) return super().paintEvent(event)                #调用主窗口的重绘事件,不用不会加载动画只显示第一帖,用了动画加载正常,但又多了一静态图第一帖#画出当前控件的矩形框(用于对象被选择时)def DrawObjRect(self,pencol,penwidth):self.rectCol=pencolself.rectPenWidth=penwidthif(self.bDrawRect):pen = QPen()                    # 创建画笔对象brush = QBrush()                # 创建画刷对象painter = QPainter(self)        # 此QPainter只能在paintEvent中定义,不能定义成类的self成员对象,也不能在其地方(如其他窗口,线程中)定义,否则没有绘画功能显示#绘制pen.setColor(pencol)                 pen.setStyle(Qt.SolidLine)               pen.setWidth(penwidth)          # 设置画笔宽度painter.setPen(pen)             # 设置画笔self.pixmap = QPixmap.fromImage(self.image)#painter.drawPixmap(0, 0, self.pixmap)painter.drawRect(0,0,self.width(),self.height()) #定义可用计时器播放连续图片以形成动画的标签扩展类    
class QLabelExLstImg(QLabelEx):def __init__(self, parent,x,y,w,h,text='',transt=1.0,font=QFont('宋体', 11),fcolor=QColor(0,0,0)):  super().__init__(parent,x,y,w,h,text,transt,font,fcolor)self.type='IMG'self.memImgFile=[]self.curtimespeed=100self.curindex = 0self.curPlayCount=0self.imgPlayCount = 0 #图象列表播放遍数,0=循环播放,大于0时为播放的遍数后,自动停止到最后一帖位置self.bStop=False      #指定遍数放完后,此开关为True# 创建计时器,设置时间间隔为100毫秒(1秒)self.timer = QTimer()# 计时器信号连接到timeout_slot槽函数self.timer.timeout.connect(self.time_objmove_slot)self.timer.start(self.curtimespeed)  # 开始计时器:#设置要播放的图片列表,及图象列表间播放的间隔def setLstImg(self,lstfilename,timesleep=50,playcount=0):self.bStop=Falseself.curPlayCount=0self.lstImgFile=lstfilenameself.curtimespeed=timesleepself.imgPlayCount = playcountself.makeMemFile()#创建图片的内存文件def makeMemFile(self):self.memImgFile.clear()for imgFilename in self.lstImgFile:# 打开图片if(os.path.exists(imgFilename)):with open(imgFilename, 'rb') as f:img = f.read()self.memImgFile.append(img)#得到对象的文件内存数据:序号def getImgData(self,index):  count=len(self.memImgFile)if(count>0 and index>=0 and index<count):return self.memImgFile[index]else:print(f'返回一空图象{index},{count}')return None#显示内存文件数据:序号    def showMemImg(self,index):if(self.getImgData(index)!=None):self.curData = self.getImgData(index)self.RefreshLable()#在标签控件中播放下一帧def next_frame(self):count=len(self.memImgFile)if(count==0 or self.bStop):returnif(self.curindex>=(count-1)): #已循环一遍if(self.imgPlayCount>=0):self.curPlayCount+=1if(self.imgPlayCount>0 and self.curPlayCount>=self.imgPlayCount):self.curPlayCount = self.imgPlayCount+1self.curData = self.getImgData(count-1)self.bStop=Truereturnself.curData = self.getImgData(self.curindex)self.curindex=0else:self.curData = self.getImgData(self.curindex)self.curindex = (self.curindex + 1) % count self.timer.setInterval(self.curtimespeed)#对象计时器来显示动画效果def time_objmove_slot(self):self.next_frame()   #得到下一帖图象#移动前对图象进行方向进行处理if (self.curData==None):   # 没图片,则不执行任何操作returnsize = self.geometry()fx = size.x()+size.width()/2 #对象矩形中心的坐标fy = size.y()+size.height()/2 if(self.type=='IMG'):  #对GIF,计时器会会造成播放过快无法控制self.RefreshLable()#定义标签类按纽扩展类      
class QLabelExBtn(QLabelEx):def __init__(self, parent,x,y,w,h,text='',transt=1.0,font=QFont('宋体', 11),fcolor=QColor(0,0,0)):  super().__init__(parent,x,y,w,h,text,transt,font,fcolor)self.type='IMG'self.memImgFile=[]self.bEnable=True#设置要图片列表:0=按纽常规状态下的图片,1=鼠标移入控件时的图片,2=鼠标点击按纽时的图片,3=按纽失效时的图片def setBtnImg(self,lstfilename):self.lstImgFile=lstfilenameself.makeMemFile()#创建图片的内存文件def makeMemFile(self):self.memImgFile.clear()for imgFilename in self.lstImgFile:# 打开图片if(os.path.exists(imgFilename)):with open(imgFilename, 'rb') as f:img = f.read()self.memImgFile.append(img)#得到对象的文件内存数据:序号def getImgData(self,index):  count=len(self.memImgFile)if(count>0 and index>=0 and index<count):return self.memImgFile[index]else:print(f'返回一空图象{index},{count}')return None#显示内存文件数据:序号    def showMemImg(self,index):if(self.getImgData(index)!=None):self.curData = self.getImgData(index)self.RefreshLable()#移入控件事件def enterEvent(self, event):     if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件                   self.showMemImg(1)#移出控件事件def leaveEvent(self,event):   if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件                      self.showMemImg(0)#鼠标按下事件重载   def mousePressEvent(self, event): if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件if (event.button() == Qt.LeftButton): self.showMemImg(2)return super().mousePressEvent(event)#鼠标移动事件重载          def mouseMoveEvent(self, event):  if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件return super().mouseMoveEvent(event)# 鼠标左键释放        def mouseReleaseEvent(self, event):if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件return super().mouseReleaseEvent(event)def setBtnEnable(self,enable):self.bEnable = enableprint(f'self.bEnable={self.bEnable}')if(enable):self.showMemImg(0)else:self.showMemImg(3)#定义标签CHECK类按纽扩展类    
class QLabelExBtnCheck(QLabelEx):def __init__(self, parent,x,y,w,h,text='',transt=1.0,font=QFont('宋体', 11),fcolor=QColor(0,0,0)):  super().__init__(parent,x,y,w,h,text,transt,font,fcolor)self.type='IMG'self.groupID=0  #check按纽所属组数self.move_Flag=False  #控件不可在主窗体上被拖动self.memImgFile=[]self.bEnable=True     #是否可用self.bChecked=False   #是否被选中#设置按纽所属组def setBtnGroup(self,group):self.groupID=group#设置要图片列表:0=按纽未被选中时的图片,1=按纽被选中时的图片,2=按纽未被选中失效时的图片,3=按纽被选中失效时的图片def setBtnImg(self,lstfilename):self.lstImgFile=lstfilenameself.makeMemFile()#创建图片的内存文件def makeMemFile(self):self.memImgFile.clear()for imgFilename in self.lstImgFile:# 打开图片if(os.path.exists(imgFilename)):with open(imgFilename, 'rb') as f:img = f.read()self.memImgFile.append(img)#得到对象的文件内存数据:序号def getImgData(self,index):  count=len(self.memImgFile)if(count>0 and index>=0 and index<count):return self.memImgFile[index]else:print(f'返回一空图象{index},{count}')return None#显示内存文件数据:序号    def showMemImg(self,index):if(self.getImgData(index)!=None):self.curData = self.getImgData(index)self.RefreshLable()#鼠标按下事件重载   def mousePressEvent(self, event): if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件if (event.button() == Qt.LeftButton): self.bChecked=not self.bCheckedif(self.bChecked):self.showMemImg(1)else:self.showMemImg(0)return super().mousePressEvent(event)#鼠标移动事件重载          def mouseMoveEvent(self, event):  if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件return super().mouseMoveEvent(event)# 鼠标左键释放        def mouseReleaseEvent(self, event):if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件return super().mouseReleaseEvent(event)def setBtnEnable(self,enable):self.bEnable = enableif(enable):if(self.bChecked):self.showMemImg(1)else:self.showMemImg(0)else:if(self.bChecked):self.showMemImg(2)else:self.showMemImg(3)
#定义标签Radio类按纽扩展类    
class QLabelExBtnRadio(QLabelEx):lst_btnRadio=[]    #定义到类构造外,的有类成员共用,每增加一个类成员实例化对象,同时加到此列表中以处理类似radio单选按纽的效果signal_RadioBntSelected = Signal(int,object)        #自定信号,radio类按纽被单击时,通知主窗口,所有本组中的其他同类radio按结全部去除被选择状态,传回参数:所属组号def __init__(self, parent,x,y,w,h,text='',transt=1.0,font=QFont('宋体', 11),fcolor=QColor(0,0,0)):  super().__init__(parent,x,y,w,h,text,transt,font,fcolor)self.type='IMG'self.groupID=0  #check按纽所属组数self.ID=0self.move_Flag=False  #控件不可在主窗体上被拖动self.memImgFile=[]self.bEnable=True     #是否可用self.bChecked=False   #是否被选中QLabelExBtnRadio.lst_btnRadio.append(self)  #单选按纽本身加入公用列表#设置按纽所属组和在组中的编号IDdef setBtnGroup(self,group,ID):self.groupID=groupself.ID=ID#设置要图片列表:0=按纽未被选中时的图片,1=按纽被选中时的图片,2=按纽未被选中失效时的图片,3=按纽被选中失效时的图片def setBtnImg(self,lstfilename):self.lstImgFile=lstfilenameself.makeMemFile()#创建图片的内存文件def makeMemFile(self):self.memImgFile.clear()for imgFilename in self.lstImgFile:# 打开图片if(os.path.exists(imgFilename)):with open(imgFilename, 'rb') as f:img = f.read()self.memImgFile.append(img)#得到对象的文件内存数据:序号def getImgData(self,index):  count=len(self.memImgFile)if(count>0 and index>=0 and index<count):return self.memImgFile[index]else:print(f'返回一空图象{index},{count}')return None#显示内存文件数据:序号    def showMemImg(self,index):if(self.getImgData(index)!=None):self.curData = self.getImgData(index)self.RefreshLable()#鼠标按下事件重载   def mousePressEvent(self, event): if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件if (event.button() == Qt.LeftButton):  self.setBtnChecked(True)  #本对象被选中,同组内的其他成员去除选中状态,一组成员中只能有一个被选中for obj in QLabelExBtnRadio.lst_btnRadio:if(self.groupID==obj.groupID and self.ID!=obj.ID):  #是同一组其他对象obj.setBtnChecked(False)self.signal_RadioBntSelected.emit(self.groupID,self)return super().mousePressEvent(event)   #不调用父类的按下事件#鼠标移动事件重载          def mouseMoveEvent(self, event):  if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件return super().mouseMoveEvent(event)# 鼠标左键释放        def mouseReleaseEvent(self, event):if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件return super().mouseReleaseEvent(event)def setBtnEnable(self,enable):self.bEnable = enableif(enable):if(self.bChecked):self.showMemImg(1)else:self.showMemImg(0)else:if(self.bChecked):self.showMemImg(2)else:self.showMemImg(3)#设置Radio按纽的显示状态def setBtnChecked(self,checked):if(not self.bEnable): return     #当按纽状记为不可用时,不接受鼠标事件self.bChecked = checkedif(self.bChecked):self.showMemImg(1)else:self.showMemImg(0)

本示例用到图像文件:1.png  1.jpg  2.png 1.gif 2.gif等文件自行找些改名后,copy到代码目录下即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/70328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0到1:固件分析

固件分析 0x01 固件提取 1、从厂商官网下载 例如D-link的固件&#xff1a; https://support.dlink.com/resource/products/ 2、代理或镜像设备更新时的流量 发起中间人攻击MITM #启用IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables&#xff0c;将目…

后端开发:开启技术世界的新大门

在互联网的广阔天地中&#xff0c;后端开发宛如一座大厦的基石&#xff0c;虽不直接与用户 “面对面” 交流&#xff0c;却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域&#xff0c;负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…

银河麒麟系统安装mysql5.7【亲测可行】

一、安装环境 cpu&#xff1a;I5-10代&#xff1b; 主板&#xff1a;华硕&#xff1b; OS&#xff1a;银河麒麟V10&#xff08;SP1&#xff09;未激活 架构&#xff1a;Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本&#xff1a;mysql-5.7.34-linux-glibc2.12-x86_64.ta…

从零开始学习PX4源码9(部署px4源码到gitee)

目录 文章目录 目录摘要1.gitee上创建仓库1.1 gitee上创建仓库PX4代码仓库1.2 gitee上创建子仓库2.固件在gitee部署过程2.1下载固件到本地2.2切换本地分支2.3修改.gitmodules内容2.4同步子模块仓库地址2.5同步子模块仓库地址更新(下载)子模块3.一级子模块和二级子模块的映射关…

QT 读写锁

一、概述 1、读写锁是一种线程同步机制&#xff0c;用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁&#xff08;共享访问&#xff09;&#xff0c;但只允许一个线程获取写锁&#xff08;独占访问&#xff09;。 3、这种机制可以提高并发性能&…

二叉树(数据结构)

二叉树 二叉树也是用过递归定义的结构 先序遍历又称前序遍历 ​​ ​​ 按照先序遍历的方法去手算处理这个二叉树 ​​ 先A B C 再 A B D E C&#xff08;也就是把B换成BDE再放进去&#xff09; 再 A B D E C F 看这个插入的方法要掌握像二叉树这样向一个…

机器学习笔记——常用损失函数

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记介绍机器学习中常见的损失函数和代价函数&#xff0c;各函数的使用场景。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门…

#渗透测试#批量漏洞挖掘#畅捷通T+SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞全景解析 1. 高危漏洞案例库 2.…

nvm安装、管理node多版本以及配置环境变量【保姆级教程】

引言 不同的项目运行时可能需要不同的node版本才可以运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理。 本人在配置时&#xff0c;通过网络搜索教程&#xff0c;由于文章时间过老&#xff0c;或者文章的互相拷贝导致配置时…

框架--Mybatis3

一.特殊符号处理 < < > > " &quot; &apos; & &amp; 除了可以使用上述转义字符外&#xff0c;还可以使<![CDATA[ ]]>用来包裹特殊字符。 二.mybatis 一级缓存二级缓存 1.为什么缓存 缓存&#xff1a;数据缓存&#xf…

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎&#xff0c;专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术&#xff0c;实现在多样化硬件平台上的高效推理&#xff0c;同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…

Netty入门详解

引言 Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能网络服务器和客户端。它提供了一组丰富的 API&#xff0c;使得开发人员能够轻松地处理各种网络协议&#xff0c;如 TCP、UDP 等&#xff0c;并且支持多种编解码方式&a…

物联网简介集合

物联网&#xff08;IoT&#xff09;指的是物理设备&#xff08;如电器和车辆&#xff09;之间的互联互通。这些设备嵌入了软件、传感器和连接功能&#xff0c;使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据&#xff0c;为打造更高效、自动化的系…

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…

【Quest开发】全身跟踪

软件&#xff1a;Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件&#xff1a;Meta Quest3 最终效果&#xff1a;能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势&#xff0c;实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …

小米平板怎么和电脑共享屏幕

最近尝试使用小米平板和电脑屏幕分屏互联 发现是需要做特殊处理的&#xff0c;需要下载一款电脑安装包&#xff1a;小米妙享 关于这个安装包&#xff0c;想吐槽的是&#xff1a; 没有找到官网渠道&#xff0c;是通过其他网络方式查到下载的 不附录链接&#xff0c;原因是因为地…

java | MyBatis-plus映射和golang映射对比

文章目录 Java实体类和数据库的映射1.默认驼峰命名规则2.自定义字段映射3.关闭驼峰命名规则4.JSON序列化映射 Golang1. 结构体与表的映射2. 字段与列的映射3. 关联关系映射4. 其他映射相关标签 这篇也是做数据库映射方面的对比&#xff1a; Java 实体类和数据库的映射 1.默认…

避免踩雷!CUDA与Anaconda兼容性配置完全手册

CUDA与Anaconda深度学习环境配置指南 目录 核心概念解析安装场景分析版本冲突处理最佳实践指南常见问题解答 核心概念解析 1. 组件对比表 组件作用域包含内容查看方式NVIDIA驱动系统级GPU底层通信支持nvidia-smiCUDA Toolkit系统级完整开发工具链(nvcc等)nvcc --versioncon…

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者&#xff0c;在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践&#xff0c;帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …

2025年2月深度实测!DeepSeek、OpenAI o1、Gemini打造爆款应用及对比

我在网上看到了关于DeepSeek R1的各种说法,这是一个开源模型,其能力即便不比OpenAI o1等付费模型强,也与之相当: 由于我在日常工作中广泛使用这些人工智能模型(使用Cursor AI),我决定看看哪种模型最适合我。 在进行了200次Cursor请求后,我将分享我的实验结果。 一、…