PyQt5最全90 信号与槽之多窗口交互(2):使用信号与槽
from PyQt5.QtWidgets import *
import sys
from DateDialog2 import DateDialog2
class MultiWindow2(QWidget):
"""
多窗口交互(2):使用信号与槽
"""
def __init__(self):
super(MultiWindow2, self).__init__()
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('接收子窗口自定义信号的时间')
gridLayout = QGridLayout()
gridLayout.addWidget(self.lineEdit_inner)
gridLayout.addWidget(self.lineEdit_emit)
gridLayout.addWidget(self.open_btn)
self.setLayout(gridLayout)
def openDialog(self):
dialog = DateDialog2(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)
example = MultiWindow2()
print(example.__doc__)
example.show()
sys.exit(app.exec_())
对应的DateDialog2 文件如下
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
class DateDialog2(QDialog):
Signal_OneParameter = pyqtSignal(str) # 自定义信号
def __init__(self, parent=None):
super(DateDialog2, self).__init__(parent)
self.resize(300, 200)
self.setWindowTitle('子窗口,用来发射信号')
# 在布局中添加控件
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())
layout.addWidget(self.datetime_inner)
layout.addWidget(self.datetime_emit)
# 使用两个按钮(ok和cancel)分别连接accept和reject函数
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
layout.addWidget(buttons)
self.datetime_emit.dateTimeChanged.connect(self.emit_signal)
self.setLayout(layout)
def emit_signal(self):
date_str = self.datetime_emit.dateTime().toString()
# print(date_str)
self.Signal_OneParameter.emit(date_str)
if __name__ == '__main__':
app = QApplication(sys.argv)
example = DateDialog2()
print(example.__doc__)
example.show()
sys.exit(app.exec_())
结果
随便设置一下时间
这里DateDialog2 文件中自定义了一个Signal_OneParameter 信号
第一种方式是先实例化DateDialog2中的类,然后调用该类下的控件,进而使用类所对应的信号
这里当选择第一个文本框内容改变时,就会发射信号,进入到deal_inner_slot槽函数中,改变第一个文本框的值。
而第二种方式看起来较复杂,但其实只不过是在DateDialog2 文件中定义了新的槽函数,当日历时间改变时激活槽函数,在槽函数中发射信号,同时被改变的日期数据作为参数,最后接收在第二个文本框写入值即可。
推荐使用第二种方式,低耦合