找回密码
 立即注册
首页 业界区 业界 pyqt图形化显示—5.多个界面

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

孟茹云 2026-1-23 23:00:07
经过上述,已经能创建一个简陋的界面了。下面就扩展一下,创造多个界面,并实现界面间的参数传递。
子界面

界面

参考之前的MyWidget类 我们可以创建一个子界面SubWindow
  1. class SubWindow(QWidget):
  2.     def __init__(self):
  3.         super().__init__()
  4.         self.setWindowTitle('子窗口')
  5.         lb = QLabel('子窗口')
  6.         text = QTextEdit()
  7.         self.resize(200, 200)
  8.         ml1 = QVBoxLayout()
  9.         ml1.addWidget(lb)
  10.         ml1.addWidget(text)
  11.         self.setLayout(ml1)<br># 代码插入崩溃了,只能使用老版的插入了
复制代码
 创建一个子窗口【最近更新了win11所以界面ui和之前不太一样】  
1.png

指令

那么如何像主窗口一样显示呢,其实之前就有所涉及就是主函数中的【window.show() # 显示窗口】,我们详细分析一下
  界面.show()  显示界面  界面.hide()   隐藏界面  界面.close()  关闭界面那么我们实际应用一下
  1. class MyWidget(QWidget):
  2.     def __init__(self):
  3.         super().__init__()  # 调用父类的__init__方法,初始化QWidget
  4.         self.setWindowTitle('窗口')  # 设置窗口标题
  5.         self.resize(400, 300)  # 设置窗口大小
  6.         # x = SubWindow()
  7.         self.x = SubWindow()
  8.         self.btn1 = QPushButton('打开子窗口')
  9.         self.btn2 = QPushButton('隐藏子窗口')
  10.         self.btn3 = QPushButton('关闭子窗口')
  11.         self.btn1.clicked.connect(self.test)
  12.         self.btn2.clicked.connect(self.test)
  13.         self.btn3.clicked.connect(self.test)
  14.         ml = QVBoxLayout()  # 创建主布局
  15.         ml.addWidget(self.btn1)
  16.         ml.addWidget(self.btn2)
  17.         ml.addWidget(self.btn3)
  18.         self.setLayout(ml)  # 设置主布局
  19.     def test(self):
  20.         if self.sender() == self.btn1:
  21.             # x.show()
  22.             self.x.show()
  23.         elif self.sender() == self.btn2:
  24.             self.x.hide()
  25.         elif self.sender() == self.btn3:
  26.             self.x.close()
  27. class SubWindow(QWidget):
  28.     def __init__(self):
  29.         super().__init__()
  30.         self.setWindowTitle('子窗口')
  31.         lb = QLabel('子窗口')
  32.         text = QTextEdit()
  33.         self.resize(200, 200)
  34.         ml1 = QVBoxLayout()
  35.         ml1.addWidget(lb)
  36.         ml1.addWidget(text)
  37.         self.setLayout(ml1)
复制代码
 这样我们就得到了一个主窗口附带三个按键  
2.png

这里有一个小tip需要注意一下
  1. # x = SubWindow()
  2.   self.x = SubWindow()
复制代码
 一定要使用self.的类名称定义,否则会被视为临时数据删除,导致界面显示只是一闪而过。
界面间传输—自定义信号

控件的函数命令其实很大程度上能够满足日常使用,但总归有逻辑复杂的没办法直接应用。那么我们稍微讲一下自定义信号,然后结合界面传输进行应用。
导入库
  1. from PySide6.QtCore import Signal
复制代码
 从核心库中导入信号库
使用

在类内定义,例如
  1. send_signal = Signal(str)
复制代码
  信号名称 = Signal(接收的数据类型)
  1. self.send_signal.connect(连接的控件)
复制代码
 当信号被触发激活,会调用连接的控件
  1. self.send_signal.emit(text)
复制代码
 将text发送给连接的控件
当然这种直接连接进行传递的方式并不推荐,因为它在实际应用中并不是那么好用,如果更改就需要在多个地方进行更改
界面间传输—主界面向子界面

我们先创建好两个class类,分别在主界面放入一个输入框和两个按钮;一个按钮负责打开子界面,另一个按钮负责发送输入框的内容给子界面。子界面放入一个输入框。
我们先在主界面进行自定义信号定义
  1.     send_signal = Signal(str)
复制代码
然后我设计逻辑,将子信号的输入框settext内容绑定在信号上,点击按钮2发送主界面输入框的内容
  1.     def test(self):
  2.         self.x.show()
  3.         self.send_signal.connect(self.x.text.setText)
  4.         self.btn1.clicked.connect(self.send)
  5.     def send(self):
  6.         text = self.text1.text()
  7.         self.send_signal.emit(text)
复制代码
下面来看一下界面和应用吧
3.png
  
4.png

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

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册