pyqt5教程(八)組件

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_())

上面的例子展示一個日歷組件和標簽組件。功能是日歷中選擇的日期會顯示在標簽組件中。

日歷
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寇仓,一起剝皮案震驚了整個濱河市举户,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遍烦,老刑警劉巖俭嘁,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異服猪,居然都是意外死亡供填,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門罢猪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來近她,“玉大人,你說我怎么就攤上這事膳帕≌成樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵危彩,是天一觀的道長攒磨。 經(jīng)常有香客問我,道長汤徽,這世上最難降的妖魔是什么娩缰? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮泻骤,結(jié)果婚禮上漆羔,老公的妹妹穿的比我還像新娘。我一直安慰自己狱掂,他們只是感情好演痒,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趋惨,像睡著了一般鸟顺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上器虾,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天讯嫂,我揣著相機與錄音,去河邊找鬼兆沙。 笑死欧芽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的葛圃。 我是一名探鬼主播千扔,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼憎妙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曲楚?” 一聲冷哼從身側(cè)響起厘唾,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎龙誊,沒想到半個月后抚垃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡趟大,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年鹤树,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逊朽。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魂迄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惋耙,到底是詐尸還是另有隱情,我是刑警寧澤熊昌,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布绽榛,位于F島的核電站,受9級特大地震影響婿屹,放射性物質(zhì)發(fā)生泄漏灭美。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一昂利、第九天 我趴在偏房一處隱蔽的房頂上張望届腐。 院中可真熱鬧,春花似錦蜂奸、人聲如沸犁苏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽围详。三九已至,卻和暖如春祖屏,著一層夾襖步出監(jiān)牢的瞬間助赞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工袁勺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雹食,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓期丰,卻偏偏與公主長得像群叶,于是被迫代替她去往敵國和親吃挑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容