pyqt图形化显示—5.多个界面

经过上述,已经能创建一个简陋的界面了。下面就扩展一下,创造多个界面,并实现界面间的参数传递。

子界面

界面

参考之前的MyWidget类 我们可以创建一个子界面SubWindow

class SubWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('子窗口')
        lb = QLabel('子窗口')
        text = QTextEdit()

        self.resize(200, 200)
        ml1 = QVBoxLayout()
        ml1.addWidget(lb)
        ml1.addWidget(text)
        self.setLayout(ml1)
# 代码插入崩溃了,只能使用老版的插入了

 创建一个子窗口【最近更新了win11所以界面ui和之前不太一样】  {E82FE2DA-A37A-4ADA-B25F-CA10AB7F105F}

指令

那么如何像主窗口一样显示呢,其实之前就有所涉及就是主函数中的【window.show() # 显示窗口】,我们详细分析一下

  界面.show()  显示界面
  界面.hide()   隐藏界面
  界面.close()  关闭界面
那么我们实际应用一下
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()  # 调用父类的__init__方法,初始化QWidget
        self.setWindowTitle('窗口')  # 设置窗口标题
        self.resize(400, 300)  # 设置窗口大小

        # x = SubWindow()
        self.x = SubWindow()

        self.btn1 = QPushButton('打开子窗口')
        self.btn2 = QPushButton('隐藏子窗口')
        self.btn3 = QPushButton('关闭子窗口')

        self.btn1.clicked.connect(self.test)
        self.btn2.clicked.connect(self.test)
        self.btn3.clicked.connect(self.test)

        ml = QVBoxLayout()  # 创建主布局

        ml.addWidget(self.btn1)
        ml.addWidget(self.btn2)
        ml.addWidget(self.btn3)

        self.setLayout(ml)  # 设置主布局

    def test(self):

        if self.sender() == self.btn1:
            # x.show()
            self.x.show()
        elif self.sender() == self.btn2:
            self.x.hide()
        elif self.sender() == self.btn3:
            self.x.close()


class SubWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('子窗口')
        lb = QLabel('子窗口')
        text = QTextEdit()

        self.resize(200, 200)
        ml1 = QVBoxLayout()
        ml1.addWidget(lb)
        ml1.addWidget(text)
        self.setLayout(ml1)

 这样我们就得到了一个主窗口附带三个按键  {300FEB74-91E7-412E-915D-7C106A35A158}

这里有一个小tip需要注意一下

 # x = SubWindow()
  self.x = SubWindow()

 一定要使用self.的类名称定义,否则会被视为临时数据删除,导致界面显示只是一闪而过。

界面间传输—自定义信号

控件的函数命令其实很大程度上能够满足日常使用,但总归有逻辑复杂的没办法直接应用。那么我们稍微讲一下自定义信号,然后结合界面传输进行应用。

导入库

from PySide6.QtCore import Signal

 从核心库中导入信号库

使用

在类内定义,例如

send_signal = Signal(str)

  信号名称 = Signal(接收的数据类型)

self.send_signal.connect(连接的控件)

 当信号被触发激活,会调用连接的控件

self.send_signal.emit(text)

 将text发送给连接的控件

当然这种直接连接进行传递的方式并不推荐,因为它在实际应用中并不是那么好用,如果更改就需要在多个地方进行更改

界面间传输—主界面向子界面

我们先创建好两个class类,分别在主界面放入一个输入框和两个按钮;一个按钮负责打开子界面,另一个按钮负责发送输入框的内容给子界面。子界面放入一个输入框。

我们先在主界面进行自定义信号定义

    send_signal = Signal(str)

然后我设计逻辑,将子信号的输入框settext内容绑定在信号上,点击按钮2发送主界面输入框的内容

    def test(self):
        self.x.show()
        self.send_signal.connect(self.x.text.setText)
        self.btn1.clicked.connect(self.send)

    def send(self):
        text = self.text1.text()
        self.send_signal.emit(text)

下面来看一下界面和应用吧

{C52AC895-41F5-4281-A72B-C5D2A4EBF517}  {382F9E7F-8094-43E5-B042-6CB71D285BC8}

界面间传输—子界面向主界面

其实本质上是一致的,只需要让子界面知道主界面就可以了,因此和上面主界面和子界面一致,只有在传入参数时有不同的区别。

定义时:需要将父类传入给子界面

    def __init__(self, parent=None):
        super().__init__()
        self.parent = parent

 使用时:需要传入父类

    self.x = SubWindow(self)
    self.x.show()

只有这一点点的差别其他的函数啊,调用啊基本一致,就不再赘述。

 

posted @ 2026-01-14 11:15  Berserker兰斯洛特  阅读(10)  评论(0)    收藏  举报