本文共 7105 字,大约阅读时间需要 23 分钟。
小部件是应用程序的基本构建块。PyQt5 提供了多种有用的小部件,包括按钮、复选框、滑块或列表框。在本教程的这一部分,我们将描述几个实用的小部件:QCheckBox、切换模式下的 QPushButton、QSlider、QProgressBar 和 QCalendarWidget。
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 方法根据复选框的状态切换窗口标题。切换按钮是特殊模式下的 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 是一个具有简单句柄的小部件。通过拖动滑块的手柄,可以设置特定值。滑块通常用于调整音量、亮度等参数。
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 是一个显示进度的小部件。它用于表示长时间任务的执行状态。默认值为 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 提供基于月份的日历小部件。它允许用户以直观的方式选择日期。
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/