1. 程式人生 > 實用技巧 >pyqt各種按鈕介紹

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://easyicon.net這個網站上獲取的,這是一個非常好的網站,可以免費下載多種

格式的圖示。

按鈕下載地址:

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表示式來完成。​