在一个项目中,涉及到一批选题按钮,选题按钮要具备能触发鼠标滑动事件、点击事件等类似按钮的功能。对此,我是通过构建自定义类并继承QLabel类实现的,构建类的代码如下:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
#选题按钮,用QLabel来充当按钮。SelectQLabel继承QLabel,并重写了相关方法。
class SelectQLabel(QLabel):
clickQLabel = pyqtSignal(object) #鼠标点击QLabel时的信号
enterQLabel = pyqtSignal(object) #鼠标滑动进入QLabel时的信号
leaveQLabel = pyqtSignal(object) #鼠标滑动离开QLabel时的信号
openStatus = False #该题目是否被打开
def __init__(self, parent = None):
QLabel.__init__(self, parent)
#mousePressEvent是QLabel内置方法,在这里需要重写mousePressEvent方法
def mousePressEvent(self, QMouseEvent):
self.clickQLabel.emit(self) #当点击Qlabel时,发射自定义的clickQLabel信号,并在信号中传入当前SelectQLabel对象
#enterEvent是QLabel内置方法,在这里重写enterEvent方法
def enterEvent(self, e): # 鼠标移入labelb
self.enterQLabel.emit(self) #当鼠标滑动进入QLabel时,发射自定义的enterQLabel信号,并在信号中传入当前SelectQLabel对象
#leaveEvent是QLabel内置方法,在这里重写leaveEvent方法
def leaveEvent(self, e): # 鼠标离开label
self.leaveQLabel.emit(self) #当鼠标滑动离开QLabel时,发射自定义的leaveQLabel信号,并在信号中传入当前SelectQLabel对象
def setOpenStatus(self, openStatus):
self.openStatus = openStatus
def getOpenStatus(self):
return self.openStatus
定义好SelectQLabel类之后,如何使用呢,相关代码如下:
self.selectQuestionQLabelList[questionNO].setAlignment(Qt.AlignCenter) #字体居中
self.selectQuestionQLabelList[questionNO].resize(selectQuestionQLabelWidth, selectQuestionQLabelHeight)
self.selectQuestionQLabelList[questionNO].setStyleSheet("background-color: #66ffff; border-color:#bebebe; border-width: 2px;border-style: solid; font-size: "+str(int(self.selectQuestionQLabelList[i].height()*0.7))+"px;")
self.selectQuestionQLabelList[questionNO].move(horizontalOffSet, verticalOffSet)
horizontalOffSet = horizontalOffSet + selectQuestionQLabelWidth+self.windowWidth*0.02
self.selectQuestionQLabelList[questionNO].enterQLabel.connect(self.enterSelectQLabel) #按钮self.selectQuestionQLabelList[questionNO]发射enterQLabel信号时,执行enterSelectQLabel方法
self.selectQuestionQLabelList[questionNO].leaveQLabel.connect(self.leaveSelectQLabel) #按钮self.selectQuestionQLabelList[questionNO]发射leaveQLabel信号时,执行leaveSelectQLabel方法
self.selectQuestionQLabelList[questionNO].clickQLabel.connect(self.clickSelectQLabel) #按钮self.selectQuestionQLabelList[questionNO]发射clickQLabel信号时,执行clickSelectQLabel方法
在上面代码中,horizontalOffSet = horizontalOffSet + selectQuestionQLabelWidth+self.windowWidth*0.02之前的几行代码的作用是Qlabel按钮的属性进行设置,后面三行代码是接收信号并调用相关函数。具体的执行函数代码如下:
#鼠标滑动进入SelectQLabel时的执行函数
def enterSelectQLabel(self, selectQuestionQLabel):
if(selectQuestionQLabel.getOpenStatus() == True):
return
selectQuestionQLabel.setStyleSheet("background-color: #33ccff; border-color:#bebebe; border-width: 2px;border-style: solid; font-size: "+str(int(selectQuestionQLabel.height()*0.7))+"px;")
#鼠标滑动离开SelectQLabel时的执行函数
def leaveSelectQLabel(self, selectQuestionQLabel):
if(selectQuestionQLabel.getOpenStatus() == True):
return
selectQuestionQLabel.setStyleSheet("background-color: #66ffff; border-color:#bebebe; border-width: 2px;border-style: solid; font-size: "+str(int(selectQuestionQLabel.height()*0.7))+"px;")
#鼠标点击SelectQLabel时的执行函数
def clickSelectQLabel(self, selectQuestionQLabel):
print("clickSelectQLabel")
print(selectQuestionQLabel.text())
selectQuestionQLabel.setOpenStatus(True)
selectQuestionQLabel.setStyleSheet("background-color: #00ff00; border-color:#bebebe; border-width: 2px;border-style: solid; font-size: "+str(int(selectQuestionQLabel.height()*0.7))+"px;")
可以看到,每个执行函数中均包含参数selectQuestionQLabel,那么selectQuestionQLabel就是当前点击的SelectQLabel对象。函数为什么能够接收该对象,就是因为在SelectQLabel类中定义信号的时候,包含了对参数的定义:clickQLabel = pyqtSignal(object)
这里的核心是信号机制,下面是整个流程:
(1)当SelectQLabel按钮点击后,在SelectQLabel类的mousePressEvent函数中发射clickQLabel信号;
(2)在界面类中,接收clickQLabel信号,并调用clickSelectQLabel函数,核心代码为self.selectQuestionQLabelList[questionNO].clickQLabel.connect(self.clickSelectQLabel);
(3)执行clickSelectQLabel函数。由于在定义信号时也定义了参数(clickQLabel = pyqtSignal(object)),那么clickSelectQLabel函数就能接收相应参数(def clickSelectQLabel(self, selectQuestionQLabel):)。