您的位置:首页 > 编程语言 > Qt开发

PyQt5初级教程--PyQt5中部件[8/13]

2015-08-08 23:25 597 查看
想用PyQt5写GUI,但是网上的PyQt5资源太少了,找到一个英文的,翻译一下,和学习PyQt5的同学共勉!
(本系列中所有代码在windows7 64位[]/Python 3.4.3 32bit/PyQt GPL v5.5 for Python v3.4 (x32)/eric6-6.0.8下测试通过.)

原本地址:http://zetcode.com/gui/pyqt5/

================================================================================

部件是构建一个程序的基本组成部分.PyQt5有非常多的部件,包括按钮、复选框、滑动器和列表框.在这一章,我们会说到几个很有用的部件:QCheckBox、ToggleButton、QSlider、QProgressBar和QCalendarWidget.

QCheckBox

一个QCheckBox是一个有两种状态的部件:开或关.它是一个带标签的盒子.复选框是典型用途是在一个程序中展现特性,以便可以使其激活或禁止.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

In this example, a QCheckBox widget
is used to toggle the title of a window.

author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtCore import Qt

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)
我们选择用户自定义的changeTitle()到statChanged信号.changeTitle()方法会触发窗口标题.

def changeTitle(self, state):

if state == Qt.Checked:
self.setWindowTitle('QCheckBox')
else:
self.setWindowTitle('')
部件的状态给到changeTitle()方法中的state变量.如果部件被选中了,就会给窗口设置一个标题.否则,就会给标题题设置一个空字符串.



图片:复选框

Toggle button

一个开关按钮是一个特定模式下的QPushButton.它是有两种状态的按钮:按下和没有按下.我们通过点击在这两种状态之间切换.有些时候这个功能很实用.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

In this example, we create three toggle buttons.
They will control the background colour of a
QFrame.

author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
QFrame, QApplication)
from PyQt5.QtGui import QColor

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)

redb = QPushButton('Green', self)
redb.setCheckable(True)
redb.move(10, 60)

redb.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.我们设置QWidget的背景色为黑色.开关按钮会触发开关将颜色值变为红、绿和蓝.背景色会根据我们按的按钮而改变.
self.col = QColor(0, 0, 0) 这是最开始的
4000
时候,颜色为黑色.
redb = QPushButton('Red', self)
redb.setCheckable(True)
redb.move(10, 10)创建一个开关按钮,我们创建一个QPushButton并让他通过调用setCheckable()方法变为可检测的.

redb.clicked[bool].connect(self.setColor)

我们将clicked信号连接到我们自己定义的方法上.我们用clicked信号来操作值的真假.

source = self.sender()

我们通过开关得到按钮的值.

if source.text() == "Red":
self.col.setRed(val)

如果红色按钮被按下,我们会对应地把背景色改为红色.

self.square.setStyleSheet("QFrame { background-color: %s }" %
self.col.name())

我们通过样式表来改变背景色.



图片:开关按钮

QSlider

一个QSlider是一个简单的把手的部件.这个把手可以向前或向后拉动.这可以为指定的任务选择值.有时候用一个滑动块比用一个选值框去输入一个数值要方便多了.

在这个例子中,我们会看到一个滑动块和一个标签.这个标签会显示为一个图像.滑动块会控制标签.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

This example shows a QSlider widget.

author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""

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.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)在这里我们创建了一个水平的QSlider.
self.label = QLabel(self)
self.label.setPixmap(QPixmap('mute.png'))我们创建一个QLabel部件并设置一个最初的图片给它.
sld.valueChanged[int].connect(self.changeValue)我们连接valueChanged信号到自定义的changeValue()方法
if value == 0:
self.label.setPixmap(QPixmap('mute.png'))
...基于滑动条的值,我们设置标签对应的图片.在上面的代码,如果滑动条的值为零而图片是mute.png



图片:滑动条

QProgressBar

一个进度条部件是当我们处理冗长任务时适合使用的.它很形象所以用户知道了处理的进度.在PyQt5中的QProgressBar部件提供了一个水平或垂直的进度条.程序可以设置进度条的最小和最大值.默认的值是0到99.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

This example shows a QProgressBar widget.

author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""

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('Finished')
return

self.step = 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 = QtCore.QBasicTimer()

要激活这个进度条,我们使用一个计时器对象.

self.timer.start(100, self)

要开始计时事件,我们调用start()方法.这个方法有两个参数:超时和接收事件的对象.

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提供了一个基于日历的月部件.它允许用户用一个简单和直便的方式选择日期.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

This example shows a QCalendarWidget widget.

author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import (QWidget, QCalendarWidget,
QLabel, QApplication)
from PyQt5.QtCore import QDate

class Example(QWidget):

def __init__(self):
super().__init__()

self.initUI()

def initUI(self):

cal = QCalendarWidget(self)
cal.setGridVisible(True)
cal.move(20, 20)
cal.clicked[QDate].connect(self.showDate)

self.lbl = QLabel(self)
date = cal.selectedDate()
self.lbl.setText(date.toString())
self.lbl.move(130, 260)

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)

创建QCalendarWidget部件.

cal.clicked[QDate].connect(self.showDate)

如果我们从部件里选择一个日期,一个clicked[QDate]信号被发送.我们连接这个信号到自定义的showDate方法.

def showDate(self, date):

self.lbl.setText(date.toString())

我们通过selectedDate()方法得到选择的日期.然后我们传送日期对象到字符串并设置它到标签部件.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: