pyqt5中的組件(widgets)小工具
組件(widgets)是構(gòu)建一個應用的基礎模塊。PyQt5有廣泛的各式各樣的組件皆串,包含按鈕入偷,復選按鈕追驴,滑塊條,和列表框疏之。在這個部分的教程中殿雪,我們將學習幾種有用的組件:復選按鈕(QCheckBox),切換按鈕(ToggleButton)锋爪,滑塊條(QSlider)丙曙,進度條(ProgressBar)和日歷組件(QCalendarWidget)。
一其骄、復選框(QCheckBox)
復選框組件有兩種狀態(tài):選中和未選中亏镰。它是由一個選擇框和一個標簽組成的。一個應用中拯爽,復選框是典型的用來代表有效或無效狀態(tài)的組件索抓。
import sys
from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtCore import Qt
class Example(QWidget):
def __init__(self):
super().__init__()
self.my_UI()
def my_UI(self):
cb = QCheckBox('顯示標題', self) #QCheckBox類的構(gòu)造方法。
cb.move(20, 20)
cb.toggle() #觸發(fā)器
cb.stateChanged.connect(self.changeTitle) #將自定義的changeTitle()槽方法和stateChanged信號連接
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('復選框')
self.show()
def changeTitle(self, state): #changeTitle()方法將用于切換窗口標題
if state == Qt.Checked:
self.setWindowTitle('復選框')
else:
self.setWindowTitle('')
#復選框組件的狀態(tài)會傳入changeTitle()方法的state參數(shù)某抓,如果復選框
#被選中纸兔,我們設置窗口標題。否則否副,我們把窗口標題設置成一個空字符串汉矿。
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在我們的例子中,我們創(chuàng)建了一個復選框备禀,用來切換窗口標題洲拇。
二、切換按鈕
切換按鈕是QPushButton的特殊模式曲尸。切換按鈕有兩種狀態(tài):按下和沒有按下赋续。我們可以通過點擊它在兩種狀態(tài)之間切換。下面的列子展示了切換按鈕合適出現(xiàn)的情景另患。
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
QFrame, QApplication)
from PyQt5.QtGui import QColor
class Example(QWidget):
def __init__(self):
super().__init__()
self.my_UI()
def my_UI(self):
self.col = QColor(0, 0, 0) #初始化纽乱,讓RGB值為黑色
redb = QPushButton('紅色', self) #要創(chuàng)建切換按鈕,就要創(chuàng)建QPushButton昆箕,
redb.setCheckable(True) #并且調(diào)用setCheckable()方法讓它可被選中
redb.move(10, 10)
redb.clicked[bool].connect(self.setColor) #把clicked信號連接到我們定義的setColor方法上
#使用clicked信號來操作布爾值
redb = QPushButton('綠色', self)
redb.setCheckable(True)
redb.move(10, 60)
redb.clicked[bool].connect(self.setColor)
blueb = QPushButton('藍色', self)
blueb.setCheckable(True)
blueb.move(10, 110)
blueb.clicked[bool].connect(self.setColor)
self.square = QFrame(self)
self.square.setGeometry(150, 20, 100, 100)
self.square.setStyleSheet("QWidget { background-color: %s }" %
self.col.name())
self.setGeometry(300, 300, 300, 170)
self.setWindowTitle('開關(guān)按鈕')
self.show()
def setColor(self, pressed):
source = self.sender() #獲得發(fā)生狀態(tài)切換的按鈕
if pressed:
val = 255
else: val = 0
if source.text() == "紅色": #如果發(fā)生切換的是red按鈕鸦列,我們更新RGB值中的紅色部分的顏色值
self.col.setRed(val)
elif source.text() == "綠色":
self.col.setGreen(val)
else:
self.col.setBlue(val)
self.square.setStyleSheet("QFrame { background-color: %s }" %
self.col.name()) #使用樣式表來改變背景顏色。
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在我們的例子中鹏倘,我們創(chuàng)建了三個切換按鈕和一個QWidget組件薯嗤。我們把QWidget組件的背景顏色設置為黑色。切換按鈕將在紅色纤泵,綠色和藍色的RGB值部分進行切換骆姐。QWidget組件的背景顏色將取決于哪一個切換按鈕被按下。
三、滑塊條(QSlider)
滑塊條(QSlider)組件有一個簡單的可調(diào)節(jié)手柄玻褪。這個手柄可以前后拖動肉渴。我們可以使用這個方式來選擇具體的數(shù)值。有時使用滑塊條比直接輸入數(shù)字或使用數(shù)值選擇框更自然归园,在我們下面的例子中黄虱,我們將顯示一個滑塊條和一個標簽。標簽將會顯示一個圖像庸诱。滑塊條將控制標簽晤揣。
import sys
from PyQt5.QtWidgets import (QWidget, QSlider,
QLabel, QApplication)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
class Example(QWidget):
def __init__(self):
super().__init__()
self.my_UI()
def my_UI(self):
sld = QSlider(Qt.Horizontal, self) #創(chuàng)建一個橫向的滑塊條
sld.setFocusPolicy(Qt.NoFocus) #桥爽?好像有沒有這行不影響
sld.setGeometry(30, 40, 100, 60)
sld.valueChanged[int].connect(self.changeValue) #把valueChanged 信號連接到我們自定義的 changeValue()方法上
self.label = QLabel(self) #創(chuàng)建了一個標簽組件,并且
self.label.setPixmap(QPixmap('open.png')) #設置一個初始的無聲圖片
self.label.setGeometry(160, 40, 200, 200)
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('滑塊條')
self.show()
def changeValue(self, value): #根據(jù)滑塊條的值昧识,我們設置不同的標簽圖片
if value == 0:
self.label.setPixmap(QPixmap('mute.png'))
elif value > 0 and value <= 30:
self.label.setPixmap(QPixmap('min.png'))
elif value > 30 and value < 80:
self.label.setPixmap(QPixmap('med.png'))
else:
self.label.setPixmap(QPixmap('max.png'))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在我們的例子中钠四,我們模擬了一個音量控制器。通過拖動滑塊條的把手跪楞,我們可以改變標簽的圖像缀去。
四、進度條(QProgressBar)
當我們處理耗時長的任務時甸祭,我們需要用到進度條組件缕碎。它通過動畫的方式讓我們了解任務正在處理中。在PyQt5中池户,進度條組件提供了橫向和縱向的進度條選擇咏雌。程序員可以設置進度條的最大值和最小值。進度條的默認值是0~99校焦。
import sys
from PyQt5.QtWidgets import (QWidget, QProgressBar,
QPushButton, QApplication)
from PyQt5.QtCore import QBasicTimer
class Example(QWidget):
def __init__(self):
super().__init__()
self.my_UI()
def my_UI(self):
self.pbar = QProgressBar(self) #滑塊條類的構(gòu)造方法
self.pbar.setGeometry(30, 40, 200, 25)
self.btn = QPushButton('Start', self)
self.btn.move(40, 80)
self.btn.clicked.connect(self.doAction)
self.timer = QBasicTimer() #用定時器對象來激活進度條
self.step = 0
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('進度條')
self.show()
def timerEvent(self, e): #每個QObject類和它的子類都有timerEvent()事件處理函數(shù)用于處理定時事件
#為了對定時器事件作出反饋赊抖,我們重新實現(xiàn)了這個事件處理函數(shù)。
if self.step >= 100:
self.timer.stop()
self.btn.setText('任務完成')
return
self.step = self.step + 1
self.pbar.setValue(self.step)
def doAction(self): #在doAction()方法中寨典,我們開始和停止定時器氛雪。
if self.timer.isActive():
self.timer.stop()
self.btn.setText('開始')
else:
self.timer.start(100, self) #為了開啟定時器事件,我們調(diào)用了start()方法耸成。
#這個方法有兩個參數(shù):定時時間和接收定時器事件的對象
self.btn.setText('停止')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在我們的例子中有一個橫向進度條和一個按鈕报亩。按鈕控制滑塊條的開始和停止。
五墓猎、日歷組件(QCalendarWidget)
QCalendarWidget類提供了一個基于月的日歷組件捆昏。它允許用戶通過簡單的直觀的方式選擇日期。
import sys
from PyQt5.QtWidgets import (QWidget, QCalendarWidget,
QLabel, QApplication)
from PyQt5.QtCore import QDate
class Example(QWidget):
def __init__(self):
super().__init__()
self.my_UI()
def my_UI(self):
cal = QCalendarWidget(self) #創(chuàng)建QCalendarWidget類
cal.setGridVisible(True)
cal.move(200, 20)
cal.clicked[QDate].connect(self.showDate)
#如果我們在組件上選擇了一個日期毙沾,clicked[QDate] 信號會被發(fā)射
#我們把這個信號和自定義的showDate()方法連接
self.lbl = QLabel(self)
date = cal.selectedDate()
self.lbl.setText(date.toString())
self.lbl.move(20, 100)
self.setGeometry(300, 300, 600, 300)
self.setWindowTitle('日歷')
self.show()
def showDate(self, date): #通過selectedDate()方法檢索被選中的日期骗卜。
#然后把選中的日期對象轉(zhuǎn)化成字符串顯示在標簽組件上
self.lbl.setText(date.toString())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
上面的例子展示一個日歷組件和標簽組件。功能是日歷中選擇的日期會顯示在標簽組件中。