PyQt5基础学习-两个界面进行交互(使用信号传递)
如果不使用信号传递, 主窗口构造子窗口的变化的函数来完成窗口的交互
如果使用信号传递, 主窗口根据信号的变化来完成窗口的交互
NewDateDialog.py
from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class NewDateDialog(QDialog): Signal_OneParameter = pyqtSignal(str) def __init__(self, parent=None): super(NewDateDialog, self).__init__(parent) self.setWindowTitle("子窗口:用来发射信号") #在布局中添加部件 self.layout = QVBoxLayout(self) self.label = QLabel(self) self.label.setText("前者发射内置信号\n后者发射自定义信号") self.datetime_inner = QDateTimeEdit(self) self.datetime_inner.setCalendarPopup(True) self.datetime_inner.setDateTime(QDateTime.currentDateTime()) self.datetime_emit = QDateTimeEdit(self) self.datetime_emit.setCalendarPopup(True) self.datetime_emit.setDateTime(QDateTime.currentDateTime()) self.layout.addWidget(self.label) self.layout.addWidget(self.datetime_inner) self.layout.addWidget(self.datetime_emit) # 使用两个button(ok和cancel)分别连接accept()和reject()槽函数 buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) self.layout.addWidget(buttons) #日期发送变化时,发送信号 self.datetime_emit.dateTimeChanged.connect(self.emit_signal) def emit_signal(self): date_str = self.datetime_emit.dateTime().toString() self.Signal_OneParameter.emit(date_str)
MultiWindow2.py
""" 多窗口交互(2): 使用信号与槽 如果一个窗口A与另外一个窗口B交互, 那么A尽量不要直接访问B窗口的控件 应该访问B窗口中的信号, 并指定与信号绑定的槽函数 例: 如果A直接访问B窗口的控件, 一旦B窗口的控件发送改变, 那么A和B的代码都需要变化 """ import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import * from NewDateDialog import NewDateDialog class MultiWindow2(QWidget): def __init__(self, parent=None): super(MultiWindow2, self).__init__(parent) self.resize(400, 90) self.setWindowTitle("多窗口交互(2):使用信号与槽") self.open_btn = QPushButton("获取时间") self.lineEdit_inner = QLineEdit(self) self.lineEdit_emit = QLineEdit(self) self.open_btn.clicked.connect(self.openDialog) self.lineEdit_inner.setText("接收子窗口内置信号的时间") self.lineEdit_emit.setText("接收子窗口自定义信号的时间") grid = QGridLayout() grid.addWidget(self.lineEdit_inner) grid.addWidget(self.lineEdit_emit) grid.addWidget(self.open_btn) self.setLayout(grid) def openDialog(self): #构造实例化 dialog = NewDateDialog(self) #连接子窗口的内置信号与主窗口的槽函数 dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot) #连接子窗口的自定义信号与主窗口的槽函数 dialog.Signal_OneParameter.connect(self.deal_emit_slot) dialog.show() def deal_inner_slot(self, date): self.lineEdit_inner.setText(date.toString()) #根据发送回来的信号进行操作 def deal_emit_slot(self, dateStr): self.lineEdit_emit.setText(dateStr) if __name__ == "__main__": app = QApplication(sys.argv) form = MultiWindow2() form.show() sys.exit(app.exec_())
每天更新pyQt5内容