读Pyqt4教程,带你入门Pyqt4 _013
你是否曾经看着应用程序并思考特定的GUI项是如何产生的?大概每位程序员都这样过。然后你能看到你喜欢的GUI库提供的一系列窗口组件,但是你无法找到它。工具包通常仅仅提供最常用的窗口组件,比如按钮、文本组件、滑块等等。没有工具包能够提供一切可能的组件。
实际上有两种工具包,轻量级和重量级。FLTK工具包是一种轻量级的工具包,它仅仅提供非常基本的组件并假设程序员能够自己创建更复杂的组件。PyQt4属于重量级,它有很多窗口组件,但是并不提供非常专业化的窗口组件。比如速度计窗口组件,用来度量烧录的CD的容量(可在Nero中找到)。也没有包含常用的图表。
程序员必须自己创建这些窗口组件,通过工具包提供的绘画工具来创建。有两种方法,修改或增强已有的组件,或者从零开始创建。
烧录窗口组件
这是我们在Nero、K3B或其他CD烧录软件中看到的窗口组件。
#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial In this program, we create a custom
Burning widget. author: Jan Bodnar
website: zetcode.com
last edited: December 2010
""" import sys
from PyQt4 import QtGui, QtCore class BurningWidget(QtGui.QWidget): def __init__(self):
super(BurningWidget, self).__init__() self.initUI() def initUI(self): self.setMinimumSize(1, 30)
self.value = 75
self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675] self.connect(self, QtCore.SIGNAL("updateBurningWidget(int)"),
self.setValue) def setValue(self, value): self.value = value def paintEvent(self, e): qp = QtGui.QPainter()
qp.begin(self)
self.drawWidget(qp)
qp.end() def drawWidget(self, qp): font = QtGui.QFont('Serif', 7, QtGui.QFont.Light)
qp.setFont(font) size = self.size()
w = size.width()
h = size.height() step = int(round(w / 10.0)) till = int(((w / 750.0) * self.value))
full = int(((w / 750.0) * 700)) if self.value >= 700:
qp.setPen(QtGui.QColor(255, 255, 255))
qp.setBrush(QtGui.QColor(255, 255, 184))
qp.drawRect(0, 0, full, h)
qp.setPen(QtGui.QColor(255, 175, 175))
qp.setBrush(QtGui.QColor(255, 175, 175))
qp.drawRect(full, 0, till-full, h)
else:
qp.setPen(QtGui.QColor(255, 255, 255))
qp.setBrush(QtGui.QColor(255, 255, 184))
qp.drawRect(0, 0, till, h) pen = QtGui.QPen(QtGui.QColor(20, 20, 20), 1,
QtCore.Qt.SolidLine) qp.setPen(pen)
qp.setBrush(QtCore.Qt.NoBrush)
qp.drawRect(0, 0, w-1, h-1) j = 0 for i in range(step, 10*step, step): qp.drawLine(i, 0, i, 5)
metrics = qp.fontMetrics()
fw = metrics.width(str(self.num[j]))
qp.drawText(i-fw/2, h/2, str(self.num[j]))
j = j + 1 class Example(QtGui.QWidget): def __init__(self):
super(Example, self).__init__() self.initUI() def initUI(self): slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
slider.setFocusPolicy(QtCore.Qt.NoFocus)
slider.setRange(1, 750)
slider.setValue(75)
slider.setGeometry(30, 40, 150, 30) self.wid = BurningWidget() self.connect(slider, QtCore.SIGNAL('valueChanged(int)'),
self.changeValue)
hbox = QtGui.QHBoxLayout()
hbox.addWidget(self.wid)
vbox = QtGui.QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setLayout(vbox) self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Burning') def changeValue(self, value): self.wid.emit(QtCore.SIGNAL("updateBurningWidget(int)"), value)
self.wid.repaint() def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_() if __name__ == '__main__':
main()
该例子中,我们又一个 QSlider 和一个自定义窗口组件,滑块用来控制自定义窗口组件。该窗口组件图形化的显示媒体的总量和可用的空余空间。自定义的车口不见的最小值是1,最大值是750。如果到达700,将开始绘制红色。通常表示超刻。
烧录部件通常放在窗体的下部,使用一个 QHBoxLayout 和一个 QVBoxLayout 来达到目的。
class BurningWidget(QtGui.QWidget):
def __init__(self):
super(BurningWidget, self).__init__()
烧录窗口组件基于 QLabel 窗口组件。
self.setMinimumSize(1, 30)
修改窗口组件最小值(高度),默认值对于我们有点小。
font = QtGui.QFont('Serif', 7, QtGui.QFont.Light)
paint.setFont(font)
使用比默认值更小的字体,更适合我们的需求。
size = self.size()
w = size.width()
h = size.height() step = int(round(w / 10.0)) till = int(((w / 750.0) * self.value))
full = int(((w / 750.0) * 700))
我们动态的绘制窗口组件,当窗口变大时,烧录窗口组件也跟着变大,反之亦然。这正是为什么我们必须计算部件的尺寸到我们自定义的部件。 till 参数决定绘制的所有尺寸。 value 从滑块获得,这是整个区域的比例。 full 参数决定我们开始绘制红色的点。注意使用浮点算术,为了实现更高的精度。
实际的绘制由三步组成。我们绘制黄色或红色和黄色矩形,然后绘制垂直线条,把部件分割多部分,最后绘制数字,用来指示媒体的容量。
metrics = qp.fontMetrics()
fw = metrics.width(str(self.num[j]))
qp.drawText(i-fw/2, h/2, str(self.num[j]))
我们使用自体度量来绘制文本,我们必须知道文本的宽度,这样才能在垂直线的中间绘制文本。
def changeValue(self, value):
self.wid.emit(QtCore.SIGNAL("updateBurningWidget(int)"), value)
self.wid.repaint()
当我们移动滑块, changeValue() 方法被调用,在该方法中我们发送一个自定义的 updateBurningWidget(int) 信号及相应参数,参数是滑块的当前值。该值稍后用来计算烧录部件的容量并绘制。
在PyQt4教程的这部分中,我们创建了一个自定义窗口组件。

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4625304.html
读Pyqt4教程,带你入门Pyqt4 _013的更多相关文章
- 读Pyqt4教程,带你入门Pyqt4 _009
QLineEdit QLineEdit 窗口组件用来输入或者编辑单行纯文本,有撤销/重做,剪切/粘贴和拖放功能. #!/usr/bin/python # -*- coding: utf-8 -*- # ...
- 读Pyqt4教程,带你入门Pyqt4 _005
对话框窗体或对话框是现代GUI应用不可或缺的一部分.dialog定义为两个或多个人之间的交谈.在计算机程序中dialog是一个窗体,用来和程序“交谈”.对话框用来输入数据.修改数据.改变程序设置等等. ...
- 读Pyqt4教程,带你入门Pyqt4 _004
在PyQt4教程的这部分中,我们将探讨应用中事件和信号的发生. 事件是GUI程序的重要部分,由用户或者系统产生.当我们调用应用的 exec_() 方法,应用进入主循环.主循环获取事件并把它们发往对象. ...
- 读Pyqt4教程,带你入门Pyqt4 _003
编程中的一个重要事情是布局管理,布局管理是如何在窗体上摆放窗口组件.可以有两种方式进行管理:绝对定位或使用布局类. 绝对定位 程序员用像素指定每个控件的位置和尺寸.使用绝对定位时,你必须理解几件事情. ...
- 读Pyqt4教程,带你入门Pyqt4 _002
在这节教程中,我们将创建菜单和工具栏. QMainWindow 类提供应用程序主窗口,可以创建一个经典的拥有状态栏.工具栏和菜单栏的应用程序骨架. 菜单栏 菜单栏是GUI应用程序最明显的部分之一,这是 ...
- 读Pyqt4教程,带你入门Pyqt4 _012
颜色 颜色是指一个代表红(Red).绿(Green).蓝(Blue)(RGB)强度值组合的对象,有效的RGB值在0~255之间.我们可以用多种方式定义颜色,最常用的是RGB十进制或者十六进制值.也可以 ...
- 读Pyqt4教程,带你入门Pyqt4 _010
在PyQt4教程的这部分中,我们讨论拖放操作. 拖放(Drag-and-drop)指的是图形用户界面(Graphical user interface)中,在一个虚拟的对象上按着鼠标键将之拖曳到另一个 ...
- 读Pyqt4教程,带你入门Pyqt4 _006
窗口组件是应用程序的基本构建块.PyQt4编程工具包拥有范围广泛的各种窗口组件.按钮.选择框.滑块.列表框等等,程序员工作所需要的一切.在教程的这部分中,我们将介绍一些有用的窗口组件. QCheckB ...
- 读Pyqt4教程,带你入门Pyqt4 _008
QCalendarWidget QCalendarWidget 提供基于月份的日历窗口组件,它允许用户简单并且直观的选择日期. #!/usr/bin/python # -*- coding: utf- ...
随机推荐
- 疯子的算法总结10--最小生成树Kruscal
按照权值排序可得,就有如下顺序: 1. 1-2 1 2. 1-4 2 3. 1-5 2 4. 2-5 3 5. 2-3 4 6. 4-5 4 每次选取最小边泉,判断是否同属一个集合,如果不属于同一集合 ...
- 题解 CF1286A 【Garland】
updata on 2020.3.19 往博客园搬的时候看了看自己以前写的blog 其实没多久,才两个多月,感觉自己之前写的东西好罗嗦啊.. 但也是最近写的blog才开始多起来 当然现在也没好到哪去. ...
- 动态SQL各个标签作用以及注意事项详解
创建com.mybatis包,包含:UserMapper.xml和mybatis-config.xml UserMapper.xml代码: <?xml version="1.0&quo ...
- Hadoop入门学习笔记-第二天 (HDFS:NodeName高可用集群配置)
说明:hdfs:nn单点故障,压力过大,内存受限,扩展受阻.hdfs ha :主备切换方式解决单点故障hdfs Federation联邦:解决鸭梨过大.支持水平扩展,每个nn分管一部分目录,所有nn共 ...
- P1680 奇怪的分组(组合数+逆元)
传送门戳我 首先将n减去所有的Ci,于是是原问题转换为:n个相同的球放入m个不同盒子里,不能为空,求方案数. 根据插空法:n个球,放到m个箱子里去不能为空,也就是有m-1块板子放在n-1个空隙之间 那 ...
- JAVA设计模式之组合模式(composite)
组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...
- learn from collection framework design
最难忍受的痛苦,也许是想干一件事情而又不去干.--罗曼·罗兰 前言 本篇文章算是拾人牙慧吧,偶尔谷歌到一个能很好把collection framework design讲好的文档,一是为了总结提升,也 ...
- Coursera课程笔记----计算导论与C语言基础----Week 2
计算机的历史与未来(Week 2) 计算机历史 早期计算机:手工计算器➡️机械计算器➡️计算机原型 现代计算机:电子管计算机➡️晶体管计算机➡️集成电路计算机➡️超大规模集成电路 早期的手工计算辅助工 ...
- EEGLAB-批量处理.dat数据及保存脑电地形图
步骤 1.先在图形界面操作一遍准备做的操作. 2.在命令行窗口输入 EEG.history 获取刚刚操作都用到哪些语句. 3.稍加修改即可以写一个批量化函数来读取生成数据. 4.在 EEGLAB\ee ...
- properties文件导出
功能要求根据数据库记录的key-value-remark 数据,导出保存properties文件 1. pro.load() pro.list() 处理不能解决备注.排序问题 2. 最后考虑下什么是 ...