欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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_()
相关标签: Qt qt pyqt5