博客
关于我
pyqt5教程9:Widgets组件
阅读量:797 次
发布时间:2023-03-05

本文共 7105 字,大约阅读时间需要 23 分钟。

一、提要

小部件是应用程序的基本构建块。PyQt5 提供了多种有用的小部件,包括按钮、复选框、滑块或列表框。在本教程的这一部分,我们将描述几个实用的小部件:QCheckBox、切换模式下的 QPushButton、QSlider、QProgressBar 和 QCalendarWidget。


二、PyQt5 的 QCheckBox

QCheckBox 是一个具有两种状态的小部件:开和关。它是一个带有标签的盒子。复选框通常用于表示应用程序中可以启用或禁用的功能。

示例代码

from PyQt5.QtWidgets import QWidget, QCheckBox, QApplicationfrom PyQt5.QtCore import Qtimport sysclass Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(self):        cb = QCheckBox('Show title', self)        cb.move(20, 20)        cb.toggle()        cb.stateChanged.connect(self.changeTitle)        self.setGeometry(300, 300, 350, 250)        self.setWindowTitle('QCheckBox')        self.show()    def changeTitle(self, state):        if state == Qt.Checked:            self.setWindowTitle('QCheckBox')        else:            self.setWindowTitle(' ')if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

代码解释

  • 创建复选框cb = QCheckBox('Show title', self) 创建了一个带有标签的复选框。
  • 初始化布局cb.move(20, 20) 调整复选框的位置。
  • 设置初始状态cb.toggle() 初始时将复选框设置为选中状态。
  • 连接信号cb.stateChanged.connect(self.changeTitle) 将复选框状态变化信号连接到 changeTitle 方法。
  • 更新窗口标题changeTitle 方法根据复选框的状态切换窗口标题。

  • 三、切换按钮(Toggle button)

    切换按钮是特殊模式下的 QPushButton。它是一个有两种状态的按钮:按下和未按下。通过单击在这两种状态之间切换。

    示例代码

    from PyQt5.QtWidgets import QWidget, QPushButton, QFrame, QApplicationfrom PyQt5.QtGui import QColorimport sysclass Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(self):        self.col = QColor(0, 0, 0)  # 初始颜色为黑色        redb = QPushButton('Red', self)        redb.setCheckable(True)        redb.move(10, 10)        redb.clicked[bool].connect(self.setColor)                greenb = QPushButton('Green', self)        greenb.setCheckable(True)        greenb.move(10, 60)        greenb.clicked[bool].connect(self.setColor)                blueb = QPushButton('Blue', 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, 250)        self.setWindowTitle('Toggle button')        self.show()    def setColor(self, pressed):        source = self.sender()        if pressed:            val = 255        else:            val = 0                    if source.text() == "Red":            self.col.setRed(val)        elif source.text() == "Green":            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_())

    代码解释

  • 创建切换按钮redb = QPushButton('Red', self) 创建了一个带有“Red”文本的按钮。
  • 设置切换模式redb.setCheckable(True) 使按钮可选中/未选中。
  • 连接点击信号redb.clicked[bool].connect(self.setColor) 将按钮的点击信号连接到 setColor 方法。
  • 更新颜色setColor 方法根据按钮的状态(pressed)切换颜色值,并更新 QFrame 的背景颜色。

  • 四、QSlider

    QSlider 是一个具有简单句柄的小部件。通过拖动滑块的手柄,可以设置特定值。滑块通常用于调整音量、亮度等参数。

    示例代码

    from PyQt5.QtWidgets import QWidget, QSlider, QLabel, QApplicationfrom PyQt5.QtCore import Qtfrom PyQt5.QtGui import QPixmapimport sysclass Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(self):        sld = QSlider(Qt.Horizontal, self)        sld.setFocusPolicy(Qt.NoFocus)        sld.setGeometry(30, 40, 200, 30)        sld.valueChanged[int].connect(self.changeValue)                self.label = QLabel(self)        self.label.setPixmap(QPixmap('mute.png'))        self.label.setGeometry(250, 40, 80, 30)                self.setGeometry(300, 300, 350, 250)        self.setWindowTitle('QSlider')        self.show()    def changeValue(self, value):        if value == 0:            self.label.setPixmap(QPixmap('mute.png'))        elif 0 < value <= 30:            self.label.setPixmap(QPixmap('min.png'))        elif 30 < 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_())

    代码解释

  • 创建滑块sld = QSlider(Qt.Horizontal, self) 创建了一个水平方向的滑块。
  • 设置焦点政策sld.setFocusPolicy(Qt.NoFocus) 禁止滑块接收焦点。
  • 连接值变化信号sld.valueChanged[int].connect(self.changeValue) 将滑块的值变化信号连接到 changeValue 方法。
  • 更新图像changeValue 方法根据滑块的值,设置标签的图像。

  • 五、QProgressBar

    QProgressBar 是一个显示进度的小部件。它用于表示长时间任务的执行状态。默认值为 0 到 99。

    示例代码

    from PyQt5.QtWidgets import QWidget, QProgressBar, QPushButton, QApplicationfrom PyQt5.QtCore import QBasicTimerimport sysclass Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(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('QProgressBar')        self.show()    def timerEvent(self, e):        if self.step >= 100:            self.timer.stop()            self.btn.setText('Finished')            return        self.step += 1        self.pbar.setValue(self.step)    def doAction(self):        if self.timer.isActive():            self.timer.stop()            self.btn.setText('Start')        else:            self.timer.start(100, self)            self.btn.setText('Stop')if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

    代码解释

  • 创建进度条self.pbar = QProgressBar(self) 创建了一个进度条。
  • 设置布局self.pbar.setGeometry(30, 40, 200, 25) 设置了进度条的位置和大小。
  • 创建按钮self.btn = QPushButton('Start', self) 创建了一个按钮。
  • 连接信号self.btn.clicked.connect(self.doAction) 将按钮的点击信号连接到 doAction 方法。
  • 启动计时器self.timer.start(100, self) 每隔 100ms 更新一次进度条。

  • 六、QCalendarWidget

    QCalendarWidget 提供基于月份的日历小部件。它允许用户以直观的方式选择日期。

    示例代码

    from PyQt5.QtWidgets import QWidget, QCalendarWidget, QLabel, QVBoxLayout, QApplicationfrom PyQt5.QtCore import QDateimport sysclass Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(self):        vbox = QVBoxLayout(self)        cal = QCalendarWidget(self)        cal.setGridVisible(True)        cal.clicked[QDate].connect(self.showDate)        vbox.addWidget(cal)                self.lbl = QLabel(self)        date = cal.selectedDate()        self.lbl.setText(date.toString())        vbox.addWidget(self.lbl)                self.setLayout(vbox)        self.setGeometry(300, 300, 350, 300)        self.setWindowTitle('Calendar')        self.show()    def showDate(self, date):        self.lbl.setText(date.toString())if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

    代码解释

  • 创建日历小部件cal = QCalendarWidget(self) 创建了一个日历小部件。
  • 设置可见性cal.setGridVisible(True) 使日历的网格可见。
  • 连接点击信号cal.clicked[QDate].connect(self.showDate) 将点击日期信号连接到 showDate 方法。
  • 显示选择的日期showDate 方法将选定的日期格式化为字符串,并显示在标签小部件中。
  • 转载地址:http://jcafk.baihongyu.com/

    你可能感兴趣的文章
    PyCharm 3.1 在索引期间永远挂起并且无法使用
    查看>>
    Pycharm Pro 2018.2 汉化专业激活破解
    查看>>
    PyCharm vs VSCode,是时候改变你的 IDE 了!
    查看>>
    PyCharm 中,“新建”(New)和“新建项目”(New Project)-ChatGPT4o作答
    查看>>
    PyCharm 代码编辑与调试运行详解
    查看>>
    Pycharm 出现 instantitaing tests 以及test session starts 的解决方法
    查看>>
    pytorch 固定随机种子
    查看>>
    Pycharm 对容器中的 Python 程序断点远程调试
    查看>>
    Pycharm 常用快捷键大全【快查字典版】
    查看>>
    Pycharm 常用快捷键大全,全网最全!
    查看>>
    PyCharm 常用的技巧完全指南
    查看>>
    PyCharm 快捷键与效率编码详解
    查看>>
    pycharm 怎么添加python依赖的包, requirements.txt文件如何导入python库
    查看>>
    PyCharm 插件工具使用
    查看>>
    PyCharm 搜索与导航栏详解
    查看>>
    PyCharm 搭建 Selenium + Python 的自动化测试环境
    查看>>
    PyCharm 数据库操作详解
    查看>>
    PyCharm 版本与管理详解
    查看>>
    PyCharm 界面排版详解
    查看>>
    pycharm 配置qt
    查看>>