pyqt各種按鈕介紹
文章轉自:https://zhuanlan.zhihu.com/p/75557483
本章一共會介紹四種按鈕:QPushButton、QToolButton、QRadioButton以及QCheckBox。
7.1 QPushButton
相信通過之前的章節,大家已經對該按鈕有一定了解,下面再介紹該按鈕的其他方法:
import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QWidget, QPushButton class Demo(QWidget): def __init__(self): super(Demo, self).__init__() self.test_button= QPushButton('Test', self) self.test_button.setCheckable(True) self.test_button.setIcon(QIcon('button.png')) self.test_button.toggled.connect(self.button_state_func) def button_state_func(self): print(self.test_button.isChecked())if __name__ == '__main__': app = QApplication(sys.argv) demo = Demo() demo.show() sys.exit(app.exec_())
1. 按鈕有標記和非標記兩種狀態,這兩種狀態下的按鈕顯示的樣子不同。通過setCheckable(True)方法可以將按
鈕設定為一個可標記的按鈕,那此時該按鈕就擁有了標記和非標記兩種狀態了。可以通過isCheckable()方法來判
斷該按鈕是否是可標記的;
2. 通過setIcon()方法給按鈕設定一個圖示,傳入的引數為QIcon();
注:本系列的所有圖示都是從
格式的圖示。
按鈕下載地址:https://www.easyicon.net/download/png/1186368/64/
3. toggled訊號是專門用來配合按鈕標記狀態變化的,也就是說按鈕標記狀態發生變化就會發出toggled訊號。在這
裡將toggled訊號和自定義的槽函式連線了起來;
4. 通過isChecked()方法來判斷按鈕是否為標記狀態,若是則返回True,不是則返回False。所以該槽函式會在按鈕
標記狀態發生改變的時候啟動,並列印True和False。
7.2 QToolButton
QToolButton是與工具操作相關的按鈕,通常和QToolBar搭配使用。QToolButton一般不用來顯示文字,而顯示圖示
QIcon(關於QToolBar我們會在後續介紹QMainWindow的時候再詳細講解)。
不過在方法使用上,QToolButton跟QPushButton還是很像的:
import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QWidget, QToolButton class Demo(QWidget): def __init__(self): super(Demo, self).__init__() self.test_button = QToolButton(self) # 1 self.test_button.setCheckable(True) self.test_button.setIcon(QIcon('button.png')) self.test_button.toggled.connect(self.button_state_func) self.test_button.isCheckable() def button_state_func(self) print(self.test_button.isChecked()) if __name__ == '__main__': app = QApplication(sys.argv) demo = Demo() demo.show() sys.exit(app.exec_())
1. 請注意不能在QToolButton例項化的時候直接傳入文字字串,因為該控制元件沒有相應的初始化函式。也就是說這樣
做是錯誤的:self.test_button = QToolButton('Test', self) 如果要設定文字的話得通過setText()方法。但是setText()方
法和setIcon()方法都使用的話,只會顯示圖示。
7.3 QRadioButton
該控制元件為單選按鈕,也就是說預設每次只有一個按鈕會被選中。下面我們來完成一個開關燈泡的小程式:
import sys from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QLabel, QHBoxLayout, QVBoxLayout class Demo(QWidget): def __init__(self): super(Demo, self).__init__() self.off_button = QRadioButton('off', self) # 1 self.on_button = QRadioButton('on', self) # 2 self.pic_label = QLabel(self) # 3 self.button_h_layout = QHBoxLayout() self.pic_h_layout = QHBoxLayout() self.all_v_layout = QVBoxLayout() self.layout_init() self.radiobutton_init() self.label_init() def layout_init(self): self.pic_h_layout.addStretch(1) # 4 self.pic_h_layout.addWidget(self.pic_label) self.pic_h_layout.addStretch(1) self.button_h_layout.addWidget(self.off_button) self.button_h_layout.addWidget(self.on_button) self.all_v_layout.addLayout(self.pic_h_layout) self.all_v_layout.addLayout(self.button_h_layout) self.setLayout(self.all_v_layout) def radiobutton_init(self): self.off_button.setChecked(True) # 5 self.off_button.toggled.connect(self.on_off_bulb_func) # 6 # self.on_button.toggled.connect(self.on_off_bulb_func) def label_init(self): self.pic_label.setPixmap(QPixmap('off.png')) # 7 def on_off_bulb_func(self): # 8 if self.off_button.isChecked(): self.pic_label.setPixmap(QPixmap('off.png')) else: self.pic_label.setPixmap(QPixmap('on.png')) if __name__ == '__main__': app = QApplication(sys.argv) demo = Demo() demo.show() sys.exit(app.exec_())
1-2. 例項化兩個單選按鈕,一個off,另一個為on;
3. 這裡準備用QLabel控制元件來顯示圖片;
5. 將off單選按鈕設為選中狀態;
6. 若單選按鈕的狀態發生改變,則會發出toggled訊號。在這裡將toggled訊號和自定義的槽函式進行連線;
7. 初始狀態燈泡是不亮的,所以通過setPixmap()給QLabel設定off.png,即燈泡不亮的圖片。setPixmap()方法接受
一個QPixmap()物件;
8. 在該槽函式中,我們判斷off按鈕是否處於選中狀態,若是,則燈泡不亮,否則給QLabel設定燈泡發亮的圖片。
在上方radiobutton_init()函式中,我們只給off_button連線了訊號和槽,而on_button沒有。正如開始時提到的一
點:預設每次只有一個單選按鈕會被選中,而這裡只有兩個按鈕,所以一個按鈕的狀態發生變化,另一個必然也會。
執行截圖如下:
當點選on的時候,燈泡亮起:
7.4 QCheckBox
該控制元件為複選框,即可以進行多選操作。有時候當我們下載安裝一個軟體的時候,安裝程式會讓我們勾選需要安
裝的內容,我們以Qt安裝程式為例(Qt使用C++,而PyQt使用Python,兩者安裝方法不同):
複選框一共有三種狀態:全選中、半選中和無選中。若一個父選項的子選項全部為選中狀態,則該父選項為全選
中;若子選項全部為無選中狀態,則該父選項為無選中狀態;若子選項既有全選中和無選中狀態,則該父選項為
半選中狀態。
父選項為全選中狀態:
父選項為無選中狀態:
父選項為半選中狀態:
那現在我們就先來簡單實現這三種狀態態所用到的方法:
import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout class Demo(QWidget): def __init__(self): super(Demo, self).__init__() self.checkbox1 = QCheckBox('Checkbox 1', self) self.checkbox2 = QCheckBox('Checkbox 2', self) self.checkbox3 = QCheckBox('Checkbox 3', self) self.v_layout = QVBoxLayout() self.checkbox_init() self.layout_init() def layout_init(self): self.v_layout.addWidget(self.checkbox1) self.v_layout.addWidget(self.checkbox2) self.v_layout.addWidget(self.checkbox3) self.setLayout(self.v_layout) def checkbox_init(self): self.checkbox1.setChecked(True) # 1 # self.checkbox1.setCheckState(Qt.Checked) # 2 self.checkbox1.stateChanged.connect(lambda: self.on_state_change_func(self.checkbox1)) # 3 self.checkbox2.setChecked(False) # self.checkbox2.setCheckState(Qt.Unchecked) self.checkbox2.stateChanged.connect(lambda: self.on_state_change_func(self.checkbox2)) self.checkbox3.setTristate(True) # 4 self.checkbox3.setCheckState(Qt.PartiallyChecked) # 5 self.checkbox3.stateChanged.connect(lambda: self.on_state_change_func(self.checkbox3)) def on_state_change_func(self, checkbox): # 6 print('{} was clicked, and its current state is {}'.format(checkbox.text(), checkbox.checkState())) if __name__ == '__main__': app = QApplication(sys.argv) demo = Demo() demo.show() sys.exit(app.exec_())
1-2. 通過setChecked()方法傳入True或者False可以將複選框設為選中或無選中狀態;另外一種替代的方法是
setCheckState(),傳入的引數可以是選中狀態Qt.Checked, 無選中狀態Qt.Unchecked和半選中狀態Qt.PartiallyChecked;
3. stateChanged訊號會在複選框狀態發生改變的時候發出。這裡我們發現槽函式是帶引數的,可以通過lambda表示式來
將引數傳入槽函式。若單純使用self.on_state_change_func(self.checkbox2)則會報錯;
4-5. 如果要讓一個複選框擁有三種狀態,則必須通過setTristate(True)方法來實現。在這裡我們讓第三個複選框擁有三種
狀態;
6. checkState()方法可以獲取當前複選框的狀態,返回值為int型別,0為無選中狀態,1為半選中狀態,2位選中狀態。
執行截圖如下:
當點選不同的複選框時,控制檯輸出如下:
7.5 小結
1. QPushButton和QToolButton非常相似,不過QToolButton更多是與QToolBar搭配使用,用來顯示工具圖片;
2. 可以通過setIcon()方法來給按鈕設定圖示;可以用setPixmap()方法給QLabel控制元件設定圖片;
3. toggled訊號在按鈕狀態發生改變時發出;stateChanged也是,不過該訊號用於QCheckBox;
4. QRadioButton單選按鈕只能進行多選一操作,即每次只會有一個單選按鈕被選中;
5. 如果要讓QCheckBox擁有三種狀態的話,則需要通過setTristate(True)方法來設定;
6. 若要連線帶有引數的自定義槽函式,可以通過lambda表示式來完成。