当前位置:   article > 正文

【第八章】PyQt5 widgets(pyqt5 部件)_widge box

widge box

部件是一个应用程序的基本组件块。PyQt5具有大量的组件,包含按钮、选择框、滑块或列表盒子等。本章则主要介绍一些常用的组件:QCheckBox、tooggle模式下的QPushButton、QSlider、QProgressBar和QCalendarWidget。

QCheckBox

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

  1. import sys
  2. from PyQt5.QtCore import Qt
  3. from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
  4. class Example(QWidget):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. cb = QCheckBox('Show title', self)
  10. cb.move(20, 20)
  11. cb.toggle()
  12. cb.stateChanged.connect(self.changeTitle)
  13. self.setGeometry(300, 300, 250, 150)
  14. self.setWindowTitle('QCheckBox')
  15. self.show()
  16. def changeTitle(self, state):
  17. if state == Qt.Checked:
  18. self.setWindowTitle('QCheckBox')
  19. else:
  20. self.setWindowTitle(' ')
  21. if __name__ == '__main__':
  22. app = QApplication(sys.argv)
  23. ex = Example()
  24. 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。它是有两种状态的按钮:按下和没有按下。我们通过点击切换两种状态,在某些情况下,此功能非常的适用。

  1. import sys
  2. from PyQt5.QtGui import QColor
  3. from PyQt5.QtWidgets import QWidget, QPushButton, QFrame, QApplication
  4. class Example(QWidget):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. self.col = QColor(0, 0, 0)
  10. redb = QPushButton('Red', self)
  11. redb.setCheckable(True)
  12. redb.move(10, 10)
  13. redb.clicked[bool].connect(self.setColor)
  14. greenb = QPushButton('Green', self)
  15. greenb.setCheckable(True)
  16. greenb.move(10, 60)
  17. greenb.clicked[bool].connect(self.setColor)
  18. blueb = QPushButton('Blue', self)
  19. blueb.setCheckable(True)
  20. blueb.move(10, 110)
  21. blueb.clicked[bool].connect(self.setColor)
  22. self.square = QFrame(self)
  23. self.square.setGeometry(150, 20, 100, 100)
  24. self.square.setStyleSheet('QWidget {background-color:%s}'%self.col.name())
  25. self.setGeometry(300, 300, 280, 170)
  26. self.setWindowTitle('Toggle button')
  27. self.show()
  28. def setColor(self, pressed):
  29. source = self.sender()
  30. if pressed:
  31. val = 255
  32. else:
  33. val = 0
  34. if source.text() == "Red":
  35. self.col.setRed(val)
  36. elif source.text() == 'Green':
  37. self.col.setGreen(val)
  38. else:
  39. self.col.setBlue(val)
  40. self.square.setStyleSheet('QFrame {background-color:%s}'%self.col.name())
  41. if __name__ == "__main__":
  42. app = QApplication(sys.argv)
  43. ex = Example()
  44. 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是一个具有简单滑块的小部件,这个滑块可以来回的拖动,这样我们就可以为特定任务选择一个值。有时使用滑块比输入数字或使用旋转框更自然。

以下示例中,我们将显示一个滑块和一个标签。这个标签将用于显示一张图片,滑块则用于控制标签。

  1. from PyQt5.QtWidgets import (QWidget, QSlider,
  2. QLabel, QApplication)
  3. from PyQt5.QtCore import Qt
  4. from PyQt5.QtGui import QPixmap
  5. import sys
  6. class Example(QWidget):
  7. def __init__(self):
  8. super().__init__()
  9. self.initUI()
  10. def initUI(self):
  11. sld = QSlider(Qt.Horizontal, self)
  12. sld.setFocusPolicy(Qt.NoFocus)
  13. sld.setGeometry(30, 40, 100, 30)
  14. sld.valueChanged[int].connect(self.changeValue)
  15. self.label = QLabel(self)
  16. self.label.setPixmap(QPixmap('mute.png'))
  17. self.label.setGeometry(160, 40, 80, 30)
  18. self.setGeometry(300, 300, 280, 170)
  19. self.setWindowTitle('QSlider')
  20. self.show()
  21. def changeValue(self, value):
  22. if value == 0:
  23. self.label.setPixmap(QPixmap('mute.png'))
  24. elif value > 0 and value <= 30:
  25. self.label.setPixmap(QPixmap('min.png'))
  26. elif value > 30 and value < 80:
  27. self.label.setPixmap(QPixmap('med.png'))
  28. else:
  29. self.label.setPixmap(QPixmap('max.png'))
  30. if __name__ == '__main__':
  31. app = QApplication(sys.argv)
  32. ex = Example()
  33. 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.

  1. import sys
  2. from PyQt5.QtWidgets import QWidget, QProgressBar, QPushButton, QApplication
  3. from PyQt5.QtCore import QBasicTimer
  4. class Example(QWidget):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. self.pbar = QProgressBar(self)
  10. self.pbar.setGeometry(30, 40, 200, 25)
  11. self.btn = QPushButton('Start', self)
  12. self.btn.move(40, 80)
  13. self.btn.clicked.connect(self.doAction)
  14. self.timer = QBasicTimer()
  15. self.step = 0
  16. self.setGeometry(300, 300, 280, 170)
  17. self.setWindowTitle('QProgressBar')
  18. self.show()
  19. def timerEvent(self, e):
  20. if self.step >= 100:
  21. self.timer.stop()
  22. self.btn.setText(self.step)
  23. return
  24. self.step += 1
  25. self.pbar.setValue(self.step)
  26. def doAction(self):
  27. if self.timer.isActive():
  28. self.timer.stop()
  29. self.btn.setText('Start')
  30. else:
  31. self.timer.start(100, self)
  32. self.btn.setText('Stop')
  33. if __name__ == '__main__':
  34. app =QApplication(sys.argv)
  35. ex = Example()
  36. 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提供基于月度的日历小部件,它允许用户以简单直观的方式选择日期。

  1. import sys
  2. from PyQt5.QtWidgets import QWidget, QCalendarWidget, QLabel, QApplication, QVBoxLayout
  3. from PyQt5.QtCore import QDate
  4. class Example(QWidget):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. vbox = QVBoxLayout(self)
  10. cal = QCalendarWidget(self)
  11. cal.setGridVisible(True)
  12. cal.clicked[QDate].connect(self.showDate)
  13. vbox.addWidget(cal)
  14. self.lbl = QLabel(self)
  15. date = cal.selectedDate()
  16. self.lbl.setText(date.toString())
  17. vbox.addWidget(self.lbl)
  18. self.setLayout(vbox)
  19. self.setGeometry(300, 300, 350, 300)
  20. self.setWindowTitle('Calendar')
  21. self.show()
  22. def showDate(self, date):
  23. self.lbl.setText(date.toString())
  24. if __name__ == '__main__':
  25. app = QApplication(sys.argv)
  26. ex = Example()
  27. 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()方法检索所选日期。然后将日期对象转换为字符串并将其设置为标签小部件。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/312118
推荐阅读
相关标签
  

闽ICP备14008679号