博客 / 詳情

返回

pyqt圖形化顯示—3.常用控件

前面已經能夠通過組合構建一個基礎的能交互的ui了,接下來就是豐富界面了,一些常用控件走起~

下拉框

界面

首先導入對應庫

from PySide6.QtWidgets import  QComboBox, QVBoxLayout
QComboBox是下拉框的列表庫,QVBoxLayout是垂直佈局庫,不使用垂直佈局沒辦法表現下拉列表
下面就是構建一個下拉框了
cb = QComboBox()  # 創建下拉框
cb.addItems(['a','b','c','d'])  # 添加選項
        
self.setWindowTitle('下拉框')  # 設置窗口標題
ml = QVBoxLayout()  # 創建主佈局
ml.addWidget(cb)  # 將下拉框添加到主佈局中
self.setLayout(ml)  # 設置主佈局

image

界面屬性和基礎空間一樣,可以通過QT Designer找屬性設置 

那麼頁面ui完成,下面就是交互了

信號

常用的有以下兩種

cb.currentTextChanged.connect(self.test)
cb.currentIndexChanged.connect(self.test)

表示選項變化時,發出信號,觸發test函數

不過這兩個也是有一些細微差別的,返回的內容是有所不同的

我們用test函數測試一下

    def test(self,x):
        print('當前選項:', x)
currentTextChanged的信號觸發時候,會返回選項的內容       image
currentIndexChanged的信號觸發時,會返回選項在列表的位置【下標】    image
當然 由於這個信號是變化時候出發的,也可以使用cb.currentText()讀取當前選項

選擇框

界面

導入庫
from PySide6.QtWidgets import QCheckBox, QVBoxLayout

QCheckBox就是這個選擇框的庫啦

界面ui類似於上面的下拉框,不過由於是選擇框的形式,只有是否兩種狀態,所以只能填入一個元素

cb = QCheckBox('測試一下')  # 創建選擇框


self.setWindowTitle('選擇框')  # 設置窗口標題
ml = QVBoxLayout()  # 創建主佈局
ml.addWidget(cb)  # 將選擇框添加到主佈局中
self.setLayout(ml)  # 設置主佈局

創建選擇框,添加得到佈局中顯示

image

信號

由於只有是否兩種狀態,信號上就沒有那麼花裏胡哨了 只有一個
cb.stateChanged.connect(self.test)

狀態改變就觸發對應函數響應,返回值是一個整數

測試了一下這個選擇框有結果,選擇返回結果為2,不選擇返回結果為0【也許還有半選的選項】    image

cb.stateChanged.connect(lambda :print(cb.isChecked()))

也可以使用cb.isChecked()檢測是否被選中,返回值為True和False,選中為True     image

單選框

界面

導入庫

from PySide6.QtWidgets import QRadioButton, QButtonGroup, QVBoxLayout, 
QRadioButton庫是單選框的庫;QButtonGroup是選項按鈕組的庫,後續解決一些邏輯問題;QVBoxLayout是垂直佈局庫
下面就是單選框的ui設置了
        lb1 = QLabel('表頭1')  # 添加選項標題

        # 創建選項按鈕
        btn1 = QRadioButton('選項1')
        btn2 = QRadioButton('選項2')
        btn3 = QRadioButton('選項3')

        ml = QVBoxLayout()  # 創建主佈局
        # 添加到主佈局中
        ml.addWidget(lb1)
        ml.addWidget(btn1)
        ml.addWidget(btn2)
        ml.addWidget(btn3)
        self.setLayout(ml)  # 設置主佈局

由於是單選框那麼就出現非此即彼的關係如下圖,我只能在三個選項中選擇一個  image

但只是如同上圖一樣一個表頭三個選項那還好,如果兩個表頭,三個表頭,我需要在多個問題中選擇答案,那麼這個非此即彼的關係就會讓我們的選項總是隻存在一個。關於這個邏輯問題就需要QButtonGroup來解決了,把特定的按鈕進行組合,在這個組合內存在非此即彼的關係,與組合外無關。

        self.group1 = QButtonGroup(self)  # 創建單選框組

        lb1 = QLabel('表頭1')  # 添加選項標題

        # 創建選項按鈕
        btn1 = QRadioButton('選項1')
        btn2 = QRadioButton('選項2')
        btn3 = QRadioButton('選項3')
  
        # 添加選項到單選框組中
        self.group1.addButton(btn1)
        self.group1.addButton(btn2)
        self.group1.addButton(btn3)

        # 創建佈局
        h1 = QVBoxLayout()  # 創建佈局
        # 添加到佈局中
        h1.addWidget(lb1)
        h1.addWidget(btn1)
        h1.addWidget(btn2)
        h1.addWidget(btn3)

        ml = QVBoxLayout()  # 創建主佈局
        ml.addLayout(h1)  # 佈局添加到主佈局中

        self.setLayout(ml)  # 設置主佈局
View Code

通過self.組合名 = QButtonGroup(self)創建按鈕組合,self.組合名.addButton(按鈕名)把按鈕添加到組合內,實現組合內的邏輯關係

雖然界面是一致的,但多個表頭的邏輯關係已經發生了區分

checkedButton 函數查看按鈕是否被選中,有時候也是有用的

信號

由於上述已經將對應按鈕進行了分組,那麼我們可以直接對組進行信號處理

self.group1.buttonClicked.connect(self.test)
self.組合名.buttonClicked.connect(響應函數) 作用是該組合按鈕被點擊,觸發對應函數響應,返回值是按鈕名稱地址,需要轉換一下得到按鈕有名稱    image
    def test(self,x):
        print(x.text())

 文本框

文本框一般有兩種形式一種是富文本框(QTextEdit),類似於ppt那種文本框可以插入圖片,表格啊甚至HTML格式;另一種是純文本框(QPlainTextEdit),只應用於純文本。兩者各有優劣,前者文本框內容表現更豐富,但相對的佔用的資源就多;後者純文本,對於大量文本處理響應更快

界面

導入庫

from PySide6.QtWidgets import QTextEdit, QPlainTextEdit

已經介紹了一個是富文本框,一個是純文本框

下面就是設置和屬性部分了,作為對比兩個文本框同時顯示,上面為富文本框,下面為純文本框

        text1 = QTextEdit()  # 創建文本框
        text1.setHtml('<h1>標題</h1><b>加粗</b><i>斜體</i><u>下劃線</u>')
        #text1.setMarkdown('# 標題\n**加粗** *斜體* _下劃線_')
        #text1.setText('測試一下')
        #text1.setPlainText('測試一下')

        text2 = QPlainTextEdit()  # 創建文本框
        text2.setPlainText('<h1>標題</h1><b>加粗</b><i>斜體</i><u>下劃線</u>')

        ml = QVBoxLayout()  # 創建主佈局
        ml.addWidget(text1)  # 添加到主佈局中
        ml.addWidget(text2)
        self.setLayout(ml)  # 設置主佈局
文本框

image

通過對比就可以發現兩者的區別,同樣的在屬性上富文本框的屬性會更多一些,超鏈接啊,圖片啊等等,可以在文檔中查到

.appendPlainText('xx')  在文本框結尾添加文本 ‘xx’

.clear() 清除 等等等等

信號

常用的就一個textChanged 文本變化時觸發響應,無返回值

滑條

界面

導入庫

from PySide6.QtWidgets import QSlider
from PySide6.QtCore import Qt #枚舉類需要使用

下面就是設置參數和屬性了

sd = QSlider(Qt.Orientation.Horizontal)  # 創建水平滑條
sd.setTickPosition(QSlider.TickPosition.TicksRight)  # 設置滑條刻度位置
sd.setTickInterval(10)  # 設置滑條刻度間隔
sd.setMinimum(0)  # 設置滑條的最小值
sd.setMaximum(100)  # 設置滑條的最大值
# sd.setRange(0, 100)  # 設置滑條的範圍
sd.setSingleStep(5)  # 設置滑條的單步值
sd.setValue(50)  # 設置滑條的初始值

設置完成後添加到佈局內顯示

image

 QSlider  如果不設置那麼結果為垂直滑條

setTickPosition  可以設置刻度的位置參數如下
  參數:   NoTicks      ——>無刻度
      TicksBothSides  ——>兩側刻度
      TicksAbove      ——>上側刻度
      TicksBelow      ——>下側刻度
      TicksLeft     ——>左側刻度
      TicksRight        ——>右側刻度

信號

sd.valueChanged.connect(self.test)  # 連接滑條的valueChanged信號到槽函數

數值發生改變時候,對應函數響應

    def test(self):
        widget = self.sender()  # 獲取發送信號的對象
        print(f'滑條的值已改變:{widget.value()}')

注意返回值是對應的刻度數值

image

self.sender() 用於獲取該信號是由那個變量發送的,方便大型項目多個同類型變量的邏輯處理

 

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

發佈 評論

Some HTML is okay.