pyqt图形化显示—5.多个界面
<p>经过上述,已经能创建一个简陋的界面了。下面就扩展一下,创造多个界面,并实现界面间的参数传递。</p><h1>子界面</h1>
<h2>界面</h2>
<p>参考之前的MyWidget类 我们可以创建一个子界面SubWindow</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">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># 代码插入崩溃了,只能使用老版的插入了</pre>
</div>
<p> 创建一个子窗口【最近更新了win11所以界面ui和之前不太一样】 <img src="https://img2024.cnblogs.com/blog/1677113/202601/1677113-20260114110619032-178926943.png"></p>
<h2>指令</h2>
<p>那么如何像主窗口一样显示呢,其实之前就有所涉及就是主函数中的【window.show() # 显示窗口】,我们详细分析一下</p>
<div> 界面.show() 显示界面</div>
<div> 界面.hide() 隐藏界面
<div> 界面.close() 关闭界面</div>
</div>
<div>那么我们实际应用一下</div>
<div>
<div class="cnblogs_Highlighter">
<pre class="brush:python;collapse:true;;gutter:true;">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)
</pre>
</div>
<p> 这样我们就得到了一个主窗口附带三个按键 <img src="https://img2024.cnblogs.com/blog/1677113/202601/1677113-20260114111208237-1965688214.png"></p>
<p>这里有一个小tip需要注意一下</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;"> # x = SubWindow()
self.x = SubWindow()
</pre>
</div>
<p> 一定要使用self.的类名称定义,否则会被视为临时数据删除,导致界面显示只是一闪而过。</p>
<h1>界面间传输—自定义信号</h1>
<p>控件的函数命令其实很大程度上能够满足日常使用,但总归有逻辑复杂的没办法直接应用。那么我们稍微讲一下自定义信号,然后结合界面传输进行应用。</p>
<h2>导入库</h2>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">from PySide6.QtCore import Signal
</pre>
</div>
<p> 从核心库中导入信号库</p>
<h2>使用</h2>
<p>在类内定义,例如</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">send_signal = Signal(str)</pre>
</div>
</div>
<p> 信号名称 = Signal(接收的数据类型)</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">self.send_signal.connect(连接的控件)
</pre>
</div>
<p> 当信号被触发激活,会调用连接的控件</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">self.send_signal.emit(text)</pre>
</div>
<p> 将text发送给连接的控件</p>
<p>当然这种直接连接进行传递的方式并不推荐,因为它在实际应用中并不是那么好用,如果更改就需要在多个地方进行更改</p>
<h1>界面间传输—主界面向子界面</h1>
<p>我们先创建好两个class类,分别在主界面放入一个输入框和两个按钮;一个按钮负责打开子界面,另一个按钮负责发送输入框的内容给子界面。子界面放入一个输入框。</p>
<p>我们先在主界面进行自定义信号定义</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;"> send_signal = Signal(str)</pre>
</div>
<p>然后我设计逻辑,将子信号的输入框settext内容绑定在信号上,点击按钮2发送主界面输入框的内容</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;"> 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)</pre>
</div>
<p>下面来看一下界面和应用吧</p>
<p><img src="https://img2024.cnblogs.com/blog/1677113/202601/1677113-20260114151204882-1873350524.png"> <img src="https://img2024.cnblogs.com/blog/1677113/202601/1677113-20260114151305997-642724664.png"></p>
<h1>界面间传输—子界面向主界面</h1>
<p>其实本质上是一致的,只需要让子界面知道主界面就可以了,因此和上面主界面和子界面一致,只有在传入参数时有不同的区别。</p>
<p>定义时:需要将父类传入给子界面</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;"> def __init__(self, parent=None):
super().__init__()
self.parent = parent</pre>
</div>
<p> 使用时:需要传入父类</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;"> self.x = SubWindow(self)
self.x.show()</pre>
</div>
<p>只有这一点点的差别其他的函数啊,调用啊基本一致,就不再赘述。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/berserker-slst/p/19481044
頁:
[1]