赞
踩
部件是一个应用程序的基本组件块。PyQt5具有大量的组件,包含按钮、选择框、滑块或列表盒子等。本章则主要介绍一些常用的组件:QCheckBox、tooggle模式下的QPushButton、QSlider、QProgressBar和QCalendarWidget。
QCheckBox
QCheckBox具有两种状态的部件:打开和关闭。这是一个带有标签的盒子,复选框通常用于表示可以启用或禁用的应用程序中的功能。
- import sys
- from PyQt5.QtCore import Qt
- from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
-
-
- class 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, 250, 150)
- 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)
这是QCheckBox的构造器
cb.toggle()
我们设置了标题,因此我们也勾选了复选框。
cb.stateChanged.connect(self.changeTitle)
stateChanged 信号连接到用户定义的changeTitle()方法,,这个changeTitle()方法会切换窗口的标题。
def changeTitle(self, state): if state == Qt.Checked: self.setWindowTitle('QCheckBox') else: self.setWindowTitle(' ')
窗口小部件的状态被赋予状态变量中的changeTitle()方法,如果选中小部件,我们就设置窗口的标题,否则,我们将一个空字符串设置为标题。
Toggle button
切换按钮是特殊模式下的QPushButton。它是有两种状态的按钮:按下和没有按下。我们通过点击切换两种状态,在某些情况下,此功能非常的适用。
- import sys
- from PyQt5.QtGui import QColor
- from PyQt5.QtWidgets import QWidget, QPushButton, QFrame, QApplication
-
- class 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, 280, 170)
- 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_())
以上示例中,我们创建了三个切换按钮和一个QWidget。我们将部件背景颜色初始化设置为黑色。每个切换按钮可用于切换背景色红、绿、蓝三通道的值。最终的背景颜色取决于哪个切换按钮被按下。
self.col = QColor(0, 0, 0) 、
初始化背景颜色为黑色。
redb = QPushButton('Red', self) redb.setCheckable(True) redb.move(10, 10)
创建一个切换按钮,创建一个QPushButton并通过调用setCheckable()方法使其可以选择。
redb.clicked[bool].connect(self.setColor)
将点击信号连接到我们自定义的方法上,我们使用布尔值作为点击信号的值。
source = self.sender()
获取哪一个按钮被按下。
if source.text() == "Red": self.col.setRed(val)
比如:当按下红色按钮时,我们相应地更新颜色的红色部分。
self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())
我们使用样式表来改变背景颜色。样式表使用setStyleSheet()方法更新。
QSlider
QSlider是一个具有简单滑块的小部件,这个滑块可以来回的拖动,这样我们就可以为特定任务选择一个值。有时使用滑块比输入数字或使用旋转框更自然。
以下示例中,我们将显示一个滑块和一个标签。这个标签将用于显示一张图片,滑块则用于控制标签。
- from PyQt5.QtWidgets import (QWidget, QSlider,
- QLabel, QApplication)
- from PyQt5.QtCore import Qt
- from PyQt5.QtGui import QPixmap
- import sys
-
- class 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, 100, 30)
- sld.valueChanged[int].connect(self.changeValue)
-
- self.label = QLabel(self)
- self.label.setPixmap(QPixmap('mute.png'))
- self.label.setGeometry(160, 40, 80, 30)
-
- self.setGeometry(300, 300, 280, 170)
- self.setWindowTitle('QSlider')
- 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_())
在以上示例中,我们模拟了音量控制,通过滑动滑块的手柄,更改标签上的图像。
sld = QSlider(Qt.Horizontal, self)
这个创建了一个水平方向的滑块。
self.label = QLabel(self) self.label.setPixmap(QPixmap('mute.png'))
我们创建一个QLable部件并初始化设置为mute image。
sld.valueChanged[int].connect(self.changeValue)
将valueChanged信号连接到我们定义好的changeValue()方法
if value == 0: self.label.setPixmap(QPixmap('mute.png')) ...
根据滑块的值,我们设置标签上的 图片,以上的示例中,如果滑块的值为0,那么显示静音图标。
QProgressBar
进度条是我们处理冗长任务时使用的小部件。它是动画的,以便于用户知道任务正在进行中。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.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(self.step)
- 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)
这是QProgressBar的构造器
self.timer = QBasicTimer()
为了激活进度条,我们使用了一个事件对象。
self.timer.start(100, self)
要启动计时器事件,我们调用 它的start()方法,此方法有两个参数,超时和将接收事件的对象。
def timerEvent(self, e): if self.step >= 100: self.timer.stop() self.btn.setText('Finished') return self.step = self.step + 1 self.pbar.setValue(self.step)
每一个QObject及其后代都有一个timerEvent()事件处理程序,为了对计时器事件做出反应,我们重新实现了事件处理程序。
def doAction(self): if self.timer.isActive(): self.timer.stop() self.btn.setText('Start') else: self.timer.start(100, self) self.btn.setText('Stop')
在doAction()方法中,我们启动和停止计时器。
QCalendarWidget
QCalendarWidget提供基于月度的日历小部件,它允许用户以简单直观的方式选择日期。
- import sys
- from PyQt5.QtWidgets import QWidget, QCalendarWidget, QLabel, QApplication, QVBoxLayout
- from PyQt5.QtCore import QDate
- class 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.clicked[QDate].connect(self.showDate)
如果我们从日历部件中选择某一日期,clicked[QDate]信号将被发出,我们将该信号连接到showDate()方法。
def showDate(self, date): self.lbl.setText(date.toString())
我们通过调用selectedDate()方法检索所选日期。然后将日期对象转换为字符串并将其设置为标签小部件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。