我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
自定义信号
- 当系统内部提供的控件类别的信号不足以满足开发需求时,我们就可以选择继承自该类(子类化该类),在自定义类里面扩充一些自定义信号
- 例如:我们的按钮控件在鼠标右键单击的时候需要在界面输出“按钮被鼠标右键单击了”
- 但是我们的系统并没有右键单击信号,此时我们就需要自己手动写一个右键单击的自定义信号
- 自定义信号必须是在子类中重写方法
- 信号的定义和发射
- 定义信号:在类的内部,以类属性的形式定义一个信号
# 通过pyqtSignal函数定义一个信号 signal_name = pyqtSignal(类型1, 类型2...) # 重载版本 signal_name = pyqtSignal([int], [str])
- 发射信号:在事件机制中通过emit()方法发射信号
signal_name.emit(参数1,参数2...)
- 我们稍微了解一下类属性和实例属性(对象属性)
from PyQt5.Qt import * class MyBtn1(QPushButton): name = 'FengZi' # 类属性 class MyBtn2(QPushButton): def func(self): age = 36 # 实例属性(对象属性) print(age)
-
- 定义信号:在类的内部,以类属性的形式定义一个信号
- 事件机制 / 信号与槽机制
- 事件机制更偏底层
- 信号与槽机制是对事件机制的高级封装
- 有些控件并没有提供给我们想要的信号, 我们就需要自己重写具体的事件函数, 来捕获产生的事件
- QObject基类_信号与槽函数
- QObject基类_事件机制
-
- 按钮添加右键自定义信号示例演示
from PyQt5.Qt import * import sys class MyBtn(QPushButton): # 通过pyqtSignal方法定义一个信号rightClicked rightClicked = pyqtSignal() # 重写鼠标点击事件机制 def mousePressEvent(self, evt) -> None: # 执行父类的鼠标点击事件机制,以免覆盖掉父类本身与鼠标点击相关的信号与槽机制 super(MyBtn, self).mousePressEvent(evt) # evt.button() # 通过事件对象获取到被按下的按钮 # 判断事件对象被按下的按钮是否是右键 if evt.button() == Qt.RightButton: # print('此时需要发射右键点击信号') # 发射信号 self.rightClicked.emit() class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('自定义信号学习') self.resize(500, 300) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): btn = MyBtn('测试按钮', self) btn.resize(100, 50) btn.move(100, 100) btn.rightClicked.connect(self.btn_rightclick) btn.clicked.connect(self.btn_click) def btn_rightclick(self): print('鼠标【右键】按下了按钮') def btn_click(self): print('鼠标【左键】按下了按钮') if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())
- 在QtDesigner中使用自定义信号
- 1、首先我们创建一个py文件(rightclick_btn.py)
from PyQt5.Qt import * class MyBtn(QPushButton): # 通过pyqtSignal方法定义一个信号rightClicked rightClicked = pyqtSignal() # 重写鼠标点击事件机制 def mousePressEvent(self, evt) -> None: # 执行父类的鼠标点击事件机制,以免覆盖掉父类本身与鼠标点击相关的信号与槽机制 super(MyBtn, self).mousePressEvent(evt) # evt.button() # 通过事件对象获取到被按下的按钮 # 判断事件对象被按下的按钮是否是右键 if evt.button() == Qt.RightButton: # print('此时需要发射右键点击信号') # 发射信号 self.rightClicked.emit()
- 2、进入QtDesigner工具,创建窗体,并添加一个QPushibutton控件(与我们刚刚自定义类的父类类型一致)
- 3、在QPushibutton控件上鼠标右键 ——— 提升为...
-
- 4、给这个按钮添加信号与槽:切换到信号与槽编辑模式,这里并没有看到我们自定义的信号,需要手动添加
-
- 5、手动添加信号,点击底下的 Edit(编辑),在Signer(信号)栏添加信号
-
- 6、选择信号之后,添加槽函数
-
- 7、此时ui界面设计完成,保存ui文件后,转换成py文件,再通过新建py文件加载测试
from PyQt5.Qt import * import sys from test_rightclick import Ui_Form class Windows(QWidget, Ui_Form): def __init__(self): super().__init__() self.setWindowTitle('右键按钮ui加载测试') self.resize(500, 300) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): self.setupUi(self) def btn_click(self): print('鼠标右键按下了按钮') if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())
- 1、首先我们创建一个py文件(rightclick_btn.py)
- 用法进阶
- 其实这里的4、5、6步可以不操作,在py文件加载之后再写信号与槽
- 需要将刚刚ui界面中添加的信号与槽删除掉
from PyQt5.Qt import * import sys from test_rightclick import Ui_Form class Windows(QWidget, Ui_Form): def __init__(self): super().__init__() self.setWindowTitle('右键按钮ui加载测试') self.resize(500, 300) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): self.setupUi(self) self.pushButton.rightClicked.connect(self.btn_click) def btn_click(self): print('鼠标右键按下了按钮') if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())