pyqt5教程(八)组件

pyqt5中的组件(widgets)小工具

组件(widgets)是构建一个应用的基础模块。PyQt5有广泛的各式各样的组件,包含按钮,复选按钮,滑块条,和列表框。在这个部分的教程中,我们将学习几种有用的组件:复选按钮(QCheckBox),切换按钮(ToggleButton),滑块条(QSlider),进度条(ProgressBar)和日历组件(QCalendarWidget)。

一、复选框(QCheckBox)

复选框组件有两种状态:选中和未选中。它是由一个选择框和一个标签组成的。一个应用中,复选框是典型的用来代表有效或无效状态的组件。

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类的构造方法。
        cb.move(20, 20)
        cb.toggle()                             #触发器
        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('')

                            #复选框组件的状态会传入changeTitle()方法的state参数,如果复选框
                            #被选中,我们设置窗口标题。否则,我们把窗口标题设置成一个空字符串。
if __name__ == '__main__':
     
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在我们的例子中,我们创建了一个复选框,用来切换窗口标题。

二、切换按钮

切换按钮是QPushButton的特殊模式。切换按钮有两种状态:按下和没有按下。我们可以通过点击它在两种状态之间切换。下面的列子展示了切换按钮合适出现的情景。

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)    #要创建切换按钮,就要创建QPushButton,
        redb.setCheckable(True)             #并且调用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('开关按钮')
        self.show()
         
         
    def setColor(self, pressed):
         
        source = self.sender()          #获得发生状态切换的按钮
         
        if pressed:
            val = 255
        else: val = 0
                         
        if source.text() == "红色":    #如果发生切换的是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_())

在我们的例子中,我们创建了三个切换按钮和一个QWidget组件。我们把QWidget组件的背景颜色设置为黑色。切换按钮将在红色,绿色和蓝色的RGB值部分进行切换。QWidget组件的背景颜色将取决于哪一个切换按钮被按下。

三、滑块条(QSlider)

滑块条(QSlider)组件有一个简单的可调节手柄。这个手柄可以前后拖动。我们可以使用这个方式来选择具体的数值。有时使用滑块条比直接输入数字或使用数值选择框更自然,在我们下面的例子中,我们将显示一个滑块条和一个标签。标签将会显示一个图像。滑块条将控制标签。

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)      #创建一个横向的滑块条
        sld.setFocusPolicy(Qt.NoFocus)          #?好像有没有这行不影响
        sld.setGeometry(30, 40, 100, 60)
        sld.valueChanged[int].connect(self.changeValue) #把valueChanged 信号连接到我们自定义的 changeValue()方法上
         
        self.label = QLabel(self)                   #创建了一个标签组件,并且
        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):       #根据滑块条的值,我们设置不同的标签图片
 
        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)        #滑块条类的构造方法
        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()事件处理函数用于处理定时事件
                                    #为了对定时器事件作出反馈,我们重新实现了这个事件处理函数。
        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)  #为了开启定时器事件,我们调用了start()方法。
                                         #这个方法有两个参数:定时时间和接收定时器事件的对象
            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)         #创建QCalendarWidget类
        cal.setGridVisible(True)
        cal.move(200, 20)
        cal.clicked[QDate].connect(self.showDate)
                            #如果我们在组件上选择了一个日期,clicked[QDate] 信号会被发射
                            #我们把这个信号和自定义的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()方法检索被选中的日期。
                                    #然后把选中的日期对象转化成字符串显示在标签组件上 
         
        self.lbl.setText(date.toString())
         
         
if __name__ == '__main__':
     
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

上面的例子展示一个日历组件和标签组件。功能是日历中选择的日期会显示在标签组件中。

日历
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容