行则至 發表於 2026-1-14 11:15:00

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>&nbsp;创建一个子窗口【最近更新了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>&nbsp;这样我们就得到了一个主窗口附带三个按键  <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>&nbsp;一定要使用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>&nbsp;从核心库中导入信号库</p>
<h2>使用</h2>
<p>在类内定义,例如</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">send_signal = Signal(str)</pre>
</div>
</div>
<p>&nbsp; 信号名称 = 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>&nbsp;将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>&nbsp;使用时:需要传入父类</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">    self.x = SubWindow(self)
    self.x.show()</pre>
</div>
<p>只有这一点点的差别其他的函数啊,调用啊基本一致,就不再赘述。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/berserker-slst/p/19481044
頁: [1]
查看完整版本: pyqt图形化显示—5.多个界面