博客 / 詳情

返回

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和之前不太一樣】  {E82FE2DA-A37A-4ADA-B25F-CA10AB7F105F}

指令

那麼如何像主窗口一樣顯示呢,其實之前就有所涉及就是主函數中的【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)

 這樣我們就得到了一個主窗口附帶三個按鍵  {300FEB74-91E7-412E-915D-7C106A35A158}

這裏有一個小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)

下面來看一下界面和應用吧

{C52AC895-41F5-4281-A72B-C5D2A4EBF517}  {382F9E7F-8094-43E5-B042-6CB71D285BC8}

界面間傳輸—子界面向主界面

其實本質上是一致的,只需要讓子界面知道主界面就可以了,因此和上面主界面和子界面一致,只有在傳入參數時有不同的區別。

定義時:需要將父類傳入給子界面

    def __init__(self, parent=None):
        super().__init__()
        self.parent = parent

 使用時:需要傳入父類

    self.x = SubWindow(self)
    self.x.show()

只有這一點點的差別其他的函數啊,調用啊基本一致,就不再贅述。

 

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.