经过上述,已经能创建一个简陋的界面了。下面就扩展一下,创造多个界面,并实现界面间的参数传递。
子界面
界面
参考之前的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)<br># 代码插入崩溃了,只能使用老版的插入了
复制代码 创建一个子窗口【最近更新了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()
复制代码 只有这一点点的差别其他的函数啊,调用啊基本一致,就不再赘述。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |