1. 程式人生 > >Pyqt5系列(三)-基本介面元件之Button(2)

Pyqt5系列(三)-基本介面元件之Button(2)

Button,作為介面中觸發動作請求或者命令的一種方式,作為與使用者進行的互動操作。PyQt中的Button根據不同的使用場景劃分為不同的表現形式。Button的基類QAbstractButton,提供button的通用性功能,此類為抽象類,從因此不能例項化,由其他的Button類繼承來實現不同的功能,不同的表現形式。

QRadioButton :

class QRadioButton(QAbstractButton)
 |  QRadioButton(QWidget parent=None)
 |  QRadioButton(str, QWidget parent=None
)

由此可見QRadioButton繼承自QAbstractButton。單選按鈕提供一個按鈕和一個label,label用於顯示對應的文字資訊。單選按鈕是一種開關按鈕,可以切換為on或者off即checked或者unchecked。主要用途用於提供給使用者‘one of many’選擇。如果使用者選擇另外一個單選按鈕,則之前的就被反選了。
RaidoButton 預設是autoExclusive。對於繼承自同一個父類Wdiget的單選按鈕,他們屬於同一個exclusive按鈕組合。如果需要多個exclusive按鈕組合的時候,需要將他們放在QButtonGroup。
當單選按鈕切換到on或者off的時候,就會發送toggled()的訊號。繫結這個訊號,在按鈕狀態發生改變的時候,觸發相應的行為。

通過一個示例對QPushButton來進行說明:

#-*- coding:utf-8 -*-
'''
ToolButton
'''
__author__ = 'Tony Zhu'

from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QStyleFactory, QVBoxLayout
import sys

class RadioButton(QWidget):
    def __init__(self):
        super(RadioButton,self).__init__()
        self.initUI()

    def
initUI(self):
self.setWindowTitle("RadioButton") self.setGeometry(400,400,300,260) self._xpButton = QRadioButton("WindowsXP") self._vistaButton = QRadioButton("WindowsVista") self._windowSButton = QRadioButton("Windows") self._xpButton.toggled.connect(lambda:self.changeStyle("WindowsXP")) self._vistaButton.toggled.connect(lambda:self.changeStyle("WindowsVista")) self._windowSButton.toggled.connect(lambda:self.changeStyle("Windows")) layout = QVBoxLayout() layout.addWidget(self._xpButton) layout.addWidget(self._vistaButton) layout.addWidget(self._windowSButton) layout.addStretch(1) self.setLayout(layout) self._xpButton.setChecked(True) self.changeStyle("Windows") def changeStyle(self,styleName): QApplication.setStyle(QStyleFactory.create(styleName)) if __name__ == '__main__': app = QApplication(sys.argv) ex = RadioButton() ex.show() sys.exit(app.exec_())

執行之後的效果:
radioButton

控制元件說明:

控制元件型別 控制元件名稱 文字 圖示
QRadioButton _xpButton WindowsXP
QRadioButton _vistaButton WindowsVista
QRadioButton _windowSButton Windows

示例說明:
通過選擇單選框按鈕,來切換不同的window介面風格,XP,Vista,Windows風格
程式碼分析:
其他程式碼部分可以參考上一篇《Pyqt5系列(二 )-第一個PyQt程式》中的說明。

L19~24:

self._xpButton = QRadioButton("WindowsXP")                                     
self._vistaButton = QRadioButton("WindowsVista")
self._windowSButton = QRadioButton("Windows")        self._xpButton.toggled.connect(lambda:self.changeStyle("WindowsXP"))        self._vistaButton.toggled.connect(lambda:self.changeStyle("WindowsVista"))
       self._windowSButton.toggled.connect(lambda:self.changeStyle("Windows"))

建立_xpButton ,_vistaButton , _windowsButton三個單選框按鈕,然後將切換開關發射的toggle訊號和自定義槽函式changeStyle()繫結在一起。
在繫結槽函式的時候,由於要傳遞引數,因此通過lambada來重新定義一個函式,此函式中傳入了所需的引數。

L33:

self._xpButton.setChecked(True)

初始化設定_xpButton為選中狀態。

L36~37:

def changeStyle(self,styleName):              QApplication.setStyle(QStyleFactory.create(styleName))

通過QStyleFactory.keys()可以獲取到支援的style:
[‘Windows’, ‘WindowsXP’, ‘WindowsVista’, ‘Fusion’]
QApplication.setStyle()方法來設定介面顯示的風格,這樣可以根據自己的喜好來設定。

QCheckBox:

class QCheckBox(QAbstractButton)
 |  QCheckBox(QWidget parent=None)
 |  QCheckBox(str, QWidget parent=None)

由此可見QCheckBox繼承自QAbstractButton。
同QRadioButton,QCheckBox也是一個開關按鈕,可切換狀態on或者off,即checked或者unchecked。 一般,此複選框可以enable或者disable但不影響其他複選按鈕。但是如果此放置到一個互斥的QButtonGroup裡面,則只能選一個複選框。這是有互斥選項的QButtonGroup所限定的屬性。
當checkbox複選框是checked標記或者清楚,都會觸發stateChangeed訊號。可以使用isChecked()去查詢複選框按鈕是否標記。除了常用的選中與沒選中狀態,QCheckBox提供第三種狀態即“沒有改變”狀態。如果使用此狀態,設定其屬性setTristate(),然後用checkState()去查詢當前標記切換的狀態。

通過一個示例對QCheckBox來進行說明:

#-*- coding:utf-8 -*-
'''
CheckBox
'''
__author__ = 'Tony Zhu'

from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QGroupBox, QStyleFactory, QVBoxLayout, QTextBrowser
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont

class CheckBox(QWidget):
    def __init__(self):
        super(CheckBox,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("CheckBox")
        self.setGeometry(400,400,300,260)

        groupBox = QGroupBox("Non-Exclusive Checkboxes")
        groupBox.setFlat(True)

        self.checkBox1 = QCheckBox("&Checkbox 1")
        self.checkBox2 = QCheckBox("C&heckbox 2")
        self.checkBox2.setChecked(True)
        self.tristateBox = QCheckBox("Tri-&state button")
        self.tristateBox.setTristate(True)
        self.tristateBox.setCheckState(Qt.PartiallyChecked)

        self.checkBox1.stateChanged.connect(self.changeCheckBoxStatus)
        self.checkBox2.stateChanged.connect(self.changeCheckBoxStatus)
        self.tristateBox.stateChanged.connect(self.changeCheckBoxStatus)

        vbox = QVBoxLayout()
        vbox.addWidget(self.checkBox1)
        vbox.addWidget(self.checkBox2)
        vbox.addWidget(self.tristateBox)
        vbox.addStretch(1)
        groupBox.setLayout(vbox)

        self.lcd = QTextBrowser()
        self.lcd.setFixedHeight(190)
        self.lcd.setFont(QFont("Microsoft YaHei", 20))
        self.lcd.setText(self.getCheckBoxStatus())

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(groupBox)
        mainLayout.addWidget(self.lcd)
        self.setLayout(mainLayout)

    def changeCheckBoxStatus(self):
        self.lcd.setText(self.getCheckBoxStatus())
    def getCheckBoxStatus(self):
        status = self.checkBox1.text()+":  "+ str(self.checkBox1.checkState()) +"\n" +self.checkBox2.text()+":  "+ str(self.checkBox2.checkState()) \
                 +"\n"+self.tristateBox.text()+":  "+ str(self.tristateBox.checkState())
        return status


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = CheckBox()
    ex.show()
    sys.exit(app.exec_()) 

執行上述程式碼之後的結果如下:
CheckBox

控制元件說明:

控制元件型別 控制元件名稱 文字 功能
QCheckBox checkBox1 checkBox1 兩個狀態選擇
QCheckBox checkBox2 checkBox2 兩個狀態選擇
QCheckBox tristateBox tristateBox 三個狀態選擇
QTextBrowser lcd 顯示checkBox的狀態

示例說明:
通過複選按鈕的選擇,在textBrowser中顯示當前各個控制元件的名稱和狀態。
程式碼分析:
其他程式碼部分可以參考上一篇《Pyqt5系列(二 )-第一個PyQt程式》中的說明。

L24~26:

self.checkBox1 = QCheckBox("&Checkbox 1")
self.checkBox2 = QCheckBox("C&heckbox 2")
self.checkBox2.setChecked(True)

例項化checkBox1和checkBox2兩個物件,並將checkBox2的狀態設定為選中狀態。
設定快捷鍵的另外一種方式,使用“&”符號,如“&Checkbox 1”,則通過Alt+“c”可以完成滑鼠點選對應的行為。

L27~29:

self.tristateBox = QCheckBox("Tri-&state button")
self.tristateBox.setTristate(True)        self.tristateBox.setCheckState(Qt.PartiallyChecked)

例項化tristateBox 物件;
setTristate(),設定tristateBox 物件是否為三個狀態。”True”,設定為三個狀態。
setCheckState(),設定checkBox的狀態,具體狀態如下:
Qt.Unchecked 0 The item is unchecked.
Qt.PartiallyChecked 1 The item is partially checked. Items in hierarchical models may be partially checked if some, but not all, of their children are checked.
Qt.Checked 2 The item is checked.

L31~33:

        self.checkBox1.stateChanged.connect(self.changeCheckBoxStatus)
        self.checkBox2.stateChanged.connect(self.changeCheckBoxStatus)
        self.tristateBox.stateChanged.connect(self.changeCheckBoxStatus)

stateChanged(),QCheckBox狀態改變時的訊號。在訊號發生改變的時候觸發自定義的函式changeCheckBoxStatus()

對於button的使用,在具體操作的過程中可以參考一下PyQt5 reference class。