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和之前不太一样】 
指令
那么如何像主窗口一样显示呢,其实之前就有所涉及就是主函数中的【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)
这样我们就得到了一个主窗口附带三个按键 
这里有一个小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)
下面来看一下界面和应用吧

界面间传输—子界面向主界面
其实本质上是一致的,只需要让子界面知道主界面就可以了,因此和上面主界面和子界面一致,只有在传入参数时有不同的区别。
定义时:需要将父类传入给子界面
def __init__(self, parent=None):
super().__init__()
self.parent = parent
使用时:需要传入父类
self.x = SubWindow(self)
self.x.show()
只有这一点点的差别其他的函数啊,调用啊基本一致,就不再赘述。

浙公网安备 33010602011771号