pyqt5通过QLabel实现类似按钮功能

在一个项目中,涉及到一批选题按钮,选题按钮要具备能触发鼠标滑动事件、点击事件等类似按钮的功能。对此,我是通过构建自定义类并继承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):)。

 

你可能感兴趣的:(实际案例,技术理论,技术问题解决,python,qt,pyqt5)