PyQt5系列教程(14):複選框
上期我們學習了如何通過PyQt去構建一個進度對話框,對話框的內容暫時結束了。
今天談談複選框(QCheckBox),一般來說複選框通常用於表示可以啟用或禁用的應用程序中的功能。
今天複選框代碼的實現的最終效果是這樣的:
這裡說明一下,全選那個複選框有三種狀態:選中、半選、未選中,所以我們看到的它打勾的地方和另外三個有點不大一樣。
正式講解代碼前,我們可以去Qt的官方網站上看看QCheckBox的內容:
QCheckBox Class | Qt Widgets 5.9
儘管裡面的內容都是通過C++來描述的,但是基本內容差不多,函數名稱也一樣。所以要學習官方的文檔,特別是英語好的學友,看這個比其它文檔好一百倍。英語還是很重要的!
┏(゜ω゜)=?
概述
QCheckBox繼承自QAbstractButton,它提供了一個帶文本標籤的複選框。
QCheckBox(複選框)和QRadioButton(單選框)都是選項按鈕。這是因為它們都可以在開(選中)或者關(未選中)之間切換。區別是對用戶選擇的限制:單選框定義了「多選一」的選擇,而複選框提供的是「多選多」的選擇。
只要複選框被選中或者清除,都會發射一個stateChanged()信號。如果想在複選框狀態改變的時候觸發一個行為,請連接這個信號,可以使用 isChecked()來查詢複選框是否被選中。
除了常用的選中和未選中兩個狀態,QCheckBox還可選地提供了第三種狀態(半選)。如果需要第三種狀態,可以通過setTristate()來使它生效,並使用checkState()來查詢當前的切換狀態。
代碼學習
from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication, QPushButton,QMessageBoxnfrom PyQt5.QtCore import Qtnimport sysnnclass Example(QWidget):n n def __init__(self):n super().__init__()n self.initUI()nn def initUI(self):nn self.cb1 = QCheckBox(全選,self)n self.cb2 = QCheckBox(你是,self)n self.cb3 = QCheckBox(我的,self)n self.cb4 = QCheckBox(寶貝,self)nn bt = QPushButton(提交,self) nn #為減少行數,部分非重要代碼省略....nn self.cb1.stateChanged.connect(self.changecb1)n self.cb2.stateChanged.connect(self.changecb2)n self.cb3.stateChanged.connect(self.changecb2)n self.cb4.stateChanged.connect(self.changecb2)n bt.clicked.connect(self.go)nn self.show()n n def go(self):n if self.cb2.isChecked() and self.cb3.isChecked() and self.cb4.isChecked():n QMessageBox.information(self,I Love U,你是我的寶貝!)n elif self.cb2.isChecked() and self.cb3.isChecked():n QMessageBox.information(self,I Love U,你是我的!)n elif self.cb2.isChecked() and self.cb4.isChecked():n QMessageBox.information(self,I Love U,你是寶貝!)n elif self.cb3.isChecked() and self.cb4.isChecked():n QMessageBox.information(self,I Love U,我的寶貝!)n elif self.cb2.isChecked():n QMessageBox.information(self,I Love U,你是!)n elif self.cb3.isChecked():n QMessageBox.information(self,I Love U,我的!)n elif self.cb4.isChecked():n QMessageBox.information(self,I Love U,寶貝!) n else:n QMessageBox.information(self,I Love U,貌似你沒有勾選啊!)n n def changecb1(self):n if self.cb1.checkState() == Qt.Checked:n self.cb2.setChecked(True)n self.cb3.setChecked(True)n self.cb4.setChecked(True)n elif self.cb1.checkState() == Qt.Unchecked:n self.cb2.setChecked(False)n self.cb3.setChecked(False)n self.cb4.setChecked(False)n n def changecb2(self):n if self.cb2.isChecked() and self.cb3.isChecked() and self.cb4.isChecked():n self.cb1.setCheckState(Qt.Checked)n elif self.cb2.isChecked() or self.cb3.isChecked() or self.cb4.isChecked():n self.cb1.setTristate()n self.cb1.setCheckState(Qt.PartiallyChecked)n else:n self.cb1.setTristate(False)n self.cb1.setCheckState(Qt.Unchecked)nnif __name__ == __main__:n app = QApplication(sys.argv)n ex = Example()n sys.exit(app.exec_())n
在這個例子中我們實現了如下功能:
- 選中複選框,點擊提交,其對應的複選框內容將通過QMessageBox彈出
- 具備全選的功能
- 全選的複選框能夠實時呈現(全選、半選、未選)下面複選框的選擇情況
self.cb1 = QCheckBox(全選,self)nself.cb2 = QCheckBox(你是,self)nself.cb3 = QCheckBox(我的,self)nself.cb4 = QCheckBox(寶貝,self)n
新建4個複選框對象。
self.cb1.stateChanged.connect(self.changecb1)nself.cb2.stateChanged.connect(self.changecb2)nself.cb3.stateChanged.connect(self.changecb2)nself.cb4.stateChanged.connect(self.changecb2)n
每當複選框的狀態改變時,即每當用戶選中或取消選中該信號時,就會發出此信號。所以當產生此信號的時候,我們將其連接相應的槽函數。其中全選(cb1)那個複選框對應的是changecb1,其它的是changecb2。
我們再來看看對應的槽函數
def changecb2(self):n if self.cb2.isChecked() and self.cb3.isChecked() and self.cb4.isChecked():n self.cb1.setCheckState(Qt.Checked)n elif self.cb2.isChecked() or self.cb3.isChecked() or self.cb4.isChecked():n self.cb1.setTristate()n self.cb1.setCheckState(Qt.PartiallyChecked)n else:n self.cb1.setTristate(False)n self.cb1.setCheckState(Qt.Unchecked)n
isChecked()主要是判斷複選框是否被選中,要是選中就返回True,否則返回False。這裡有三個判斷,代表的意思如下:
1. 如果cb2、cb3、cb4都被選中,那麼cb1(全選)就會被選中。如圖:
2. 如果cb2、cb3、cb4有一個被選中,那麼cb1(全選)就會被半選。當然這裡也包括cb2、cb3、cb4三種都選中的情況,但是這種情況已經被第一種判斷承接了。如圖:
3. 其他情況,也就是cb2、cb3、cb4沒有一個被選中,那麼cb1(全選)就不會被選中。此時cb1要設置成cb1.setTristate(False),否則會導致cb1呈現出半選狀態。大家可以試試注釋這句話會有什麼效果。
這裡setCheckState(),用以設置QCheckBox的狀態:選中、半選、未選中。具體的值是這樣的:
def changecb1(self):n if self.cb1.checkState() == Qt.Checked:n self.cb2.setChecked(True)n self.cb3.setChecked(True)n self.cb4.setChecked(True)n elif self.cb1.checkState() == Qt.Unchecked:n self.cb2.setChecked(False)n self.cb3.setChecked(False)n self.cb4.setChecked(False)n
cb1如果被選中,那麼cb2、cb3、cb4也將被選中,實現全選功能。要是沒有被選中,那麼cb2、cb3、cb4也將沒有被選中,實現反選功能。像這樣:
def go(self):n if self.cb2.isChecked() and self.cb3.isChecked() and self.cb4.isChecked():n QMessageBox.information(self,I Love U,你是我的寶貝!)n elif self.cb2.isChecked() and self.cb3.isChecked():n QMessageBox.information(self,I Love U,你是我的!)n elif self.cb2.isChecked() and self.cb4.isChecked():n QMessageBox.information(self,I Love U,你是寶貝!)n elif self.cb3.isChecked() and self.cb4.isChecked():n QMessageBox.information(self,I Love U,我的寶貝!)n elif self.cb2.isChecked():n QMessageBox.information(self,I Love U,你是!)n elif self.cb3.isChecked():n QMessageBox.information(self,I Love U,我的!)n elif self.cb4.isChecked():n QMessageBox.information(self,I Love U,寶貝!)n else:n QMessageBox.information(self,I Love U,貌似你沒有勾選啊!)n
當按鈕被點擊之後,根據複選框被選中的類型及數量,我們彈出了不同的信息。
ok,今天複選框的介紹暫時就到這裡吧。下期我們再約。
如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送pyqt514,會自動得到相應的百度網盤下載鏈接。
推薦閱讀: