PyQt5 父窗口和子窗口信息通信
程序员文章站
2022-04-05 10:28:42
...
(1) 父窗口->子窗口
父窗口的__init__
函数里面先创建子窗口实例,然后再通过某个控件的信号(例如button的clicked信号)绑定某个槽(slot),槽函数直接对子窗口的控件进行操作
(2)子窗口->父窗口(参考:https://blog.csdn.net/huang_6/article/details/106788420)
这种方式比较麻烦一点,子窗口中定义一个信号(参数中指定信号的类型和数量,例如_signal = pyqtSignal(str,int)
,然后通过槽函数释放该信号,最后在主窗口上将该信号绑定到槽函数进而获取子窗口传递的消息。
具体例子如下:
# -*- coding: utf-8 -*-
"""
Created on Sun May 30 22:25:19 2021
@author: Wenqing Zhou ([email protected])
@github: https://github.com/ouening
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from random import randint
class AnotherWindow(QWidget):
"""
This "window" is a QWidget. If it has no parent, it
will appear as a free-floating window.
"""
_signal = pyqtSignal(str)
def __init__(self):
super().__init__()
layout = QVBoxLayout()
self.label = QLabel("Another Window % d" % randint(0, 100))
self.qline = QLineEdit("send_data")
self.qline.textChanged.connect(self.send_data)
self.btn = QPushButton()
# self.btn.clicked.connect(self.send_data)# send data
layout.addWidget(self.label)
layout.addWidget(self.qline)
layout.addWidget(self.btn)
self.setLayout(layout)
def send_data(self, str_data):
# str_data = self.qline.text()
print(str_data)
self._signal.emit(str_data)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.w = AnotherWindow()
self.button = QPushButton("Push for Window")
self.button.clicked.connect(self.show_new_window)
# self.button.clicked.connect(self.toggle_window)
self.input = QLineEdit()
self.input.textChanged.connect(self.w.label.setText)
self.qlabel = QLabel('测试窗口通信')
layout = QVBoxLayout()
layout.addWidget(self.button)
layout.addWidget(self.input)
layout.addWidget(self.qlabel)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def show_new_window(self, checked):
self.w.show()
self.w._signal.connect(self.process_data)
def process_data(self, str_data):
self.qlabel.setText(str_data)# change qlabel text
def toggle_window(self, checked):
if self.w.isVisible():
self.w.hide()
else:
self.w.show()
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()