在Python当中,几个类中的方法会经常互相调用,按照平时的做法,我们会惯性的去“from xxx import yyy”,但是实际上,Python是不允许Aimport了B之后,B再importA的。
那么如果有出现以下情况:
A类实例化了B类让B类show()出来,B类再show()出来之后又要调用A类中的方法,然而Python又不允许互相import,怎么办 —— 用信号。
信号可以进行事件的触发。
敲了一个小demo:
新建两个.ui文件,如图:
首先在A类中,调用B类并显示:
# -*- coding: utf-8 -*-
# @Time : 2019/7/1 11:39
# @Author : hann
# @desc:
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QApplication
from SignalB import SignalB
from signalRec import Ui_MainWindow
class SignalA(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super(SignalA, self).__init__(*args, **kwargs)
self.setupUi(self)
self.send = SignalB() # 1:实例化B类
self.pushButton.clicked.connect(self.clickThings) # 2:给按钮添加点击事件
def clickThings(self):
self.send.show() # 3:触发B类界面进行显示
if __name__ == '__main__':
app = QApplication(sys.argv)
win = SignalA()
win.show()
sys.exit(app.exec_())
此时B类,需要注册信号,并将信号发送出去,回调A类中的方法:
# -*- coding: utf-8 -*-
# @Time : 2019/7/1 11:38
# @Author : hann
# @desc: 信号发送
import sys
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtCore
from signal import Ui_MainWindow
class SignalB(QMainWindow, Ui_MainWindow):
signal = QtCore.pyqtSignal(int) # 1:注册一个信号
def __init__(self, *args, **kwargs):
super(SignalB, self).__init__(*args, **kwargs)
self.setupUi(self)
self.pushButton.clicked.connect(self.btnClick)
def btnClick(self):
try:
self.signal.emit(1) # 2:当按钮被点击时,触发信号
except Exception as e:
print(e.args)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = SignalB()
win.show()
sys.exit(app.exec_())
有发送,就要有接收的地方,那么既然是要用到A类的方法,那么回到A类,新增与B类信号中的关联,并进行事件的实现:
# -*- coding: utf-8 -*-
# @Time : 2019/7/1 11:39
# @Author : hann
# @desc: 信号接收
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QApplication
from SignalB import SignalB
from signalRec import Ui_MainWindow
class SignalA(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super(SignalA, self).__init__(*args, **kwargs)
self.setupUi(self)
self.send = SignalB()
self.pushButton.clicked.connect(self.clickThings)
self.send.signal.connect(self.signalThings) # 1:与另一个类中的注册的信号关联
def clickThings(self):
self.send.show()
@pyqtSlot(int) # 2:@pyqtSlot(int) 别忘了写 这里是为了与Slot关联起来
def signalThings(self, num):
if 1 == num:
self.label.setText("接收到了第二个页面的信号")
if __name__ == '__main__':
app = QApplication(sys.argv)
win = SignalA()
win.show()
sys.exit(app.exec_())
那么整个效果如图: