基本方法:
1. 自定义一个继承QPushbutton的类RightClickButton,需要带右击功能的按钮对象则从该类中产生
2. 在类中定义一个带参信号clickedSignal,参数用于区分单击和右击,本文以bool类型的参数为例。
3. 重写类中的mousePressEvent方法,使其对于单击和右击发送不同的信号参数给槽函数
4. 连接自定义信号与槽connect。槽函数的参数与信号对应。
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class GUI(QWidget):
def __init__(self):
super().__init__()
self.createWidgets()
self.setupUI()
def setupUI(self):
self.show()
def createWidgets(self):
self.btnRightClick = RightClickButton(self)
self.btnRightClick.setText("左/右击功能测试")
self.btnRightClick.clickedSignal.connect(self.test)
def test(self, flag):
if flag:
self.btnRightClick.setText("单击成功")
else:
self.btnRightClick.setText("右击成功")
class RightClickButton(QPushButton):
clickedSignal = pyqtSignal(bool) # 定义带参信号
def __init__(self, parent=None):
super(RightClickButton, self).__init__(parent)
def mousePressEvent(self, event): # 重定义该函数,对不同的操作释放不同的信号参数
if event.buttons() == Qt.LeftButton:
self.clickedSignal.emit(True)
elif event.buttons() == Qt.RightButton:
self.clickedSignal.emit(False)
if __name__ == '__main__':
app = QApplication([])
ui = GUI()
app.exec_()
槽函数写在类外的处理(用于解决代码太多需要拆分文件):
1. 函数写在类外,而需要调用类中的方法或属性,则需在函数中添加一个该类对象的参数
2. 默认连接信号与槽时省略参数,若使用lambda表达式强制传参,又无法获取自定义信号的参数(应该有办法,暂未找到),暂时的解决方法是在类中再写一个槽函数thisTest,该函数用于连接信号,函数内直接调用写在类外实际进行操作的函数test。
3. 以下仅列需要修改的地方
class GUI(QWidget):
''' 省略如上 '''
def createWidgets(self):
''' 省略如上 '''
self.btnRightClick.clickedSignal.connect(self.thisTest)
def thisTest(self, flag):
test(self, flag)
def test(ui, flag):
if flag:
ui.btnRightClick.setText("单击成功")
else:
ui.btnRightClick.setText("右击成功")
使用带参数的信号,方便单击和右击实现类似功能时在同一个槽函数中处理。如果实现的是不同功能,可以简化子类,在mousePressEvent方法中继承原有的clicked信号,再定义一个只表示右击的信号。实现时用不同的信号连接不同的槽函数。此时由于信号不带参数,槽函数只需传入对象本身这一参数,可用lambda表达式进行传参。
class RightClickButton(QPushButton):
rightClicked = pyqtSignal()
def __init__(self, parent=None):
super(RightClickButton, self).__init__(parent)
def mousePressEvent(self, event):
super().mousePressEvent(event) # 保留原单击发送clicked信号
if event.buttons() == Qt.RightButton:
self.rightClicked.emit()
# 对不同的信号连接不同的槽函数
self.btnRightClick.clicked.connect(self.leftClickedTest)
self.btnRightClick.rightClicked.connect(self.rightClickedTest)
# 槽函数写在类外,用lambda表达式传入对象参数
self.btnRightClick.clicked.connect(lambda : leftClickedTest(self)) # 原有单击信号
self.btnRightClick.rightClicked.connect(lambda : rightClickedTest(self)) # 自定义右击信号