你是否曾经看着应用程序并思考特定的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的更多相关文章

  1. 读Pyqt4教程,带你入门Pyqt4 _009

    QLineEdit QLineEdit 窗口组件用来输入或者编辑单行纯文本,有撤销/重做,剪切/粘贴和拖放功能. #!/usr/bin/python # -*- coding: utf-8 -*- # ...

  2. 读Pyqt4教程,带你入门Pyqt4 _005

    对话框窗体或对话框是现代GUI应用不可或缺的一部分.dialog定义为两个或多个人之间的交谈.在计算机程序中dialog是一个窗体,用来和程序“交谈”.对话框用来输入数据.修改数据.改变程序设置等等. ...

  3. 读Pyqt4教程,带你入门Pyqt4 _004

    在PyQt4教程的这部分中,我们将探讨应用中事件和信号的发生. 事件是GUI程序的重要部分,由用户或者系统产生.当我们调用应用的 exec_() 方法,应用进入主循环.主循环获取事件并把它们发往对象. ...

  4. 读Pyqt4教程,带你入门Pyqt4 _003

    编程中的一个重要事情是布局管理,布局管理是如何在窗体上摆放窗口组件.可以有两种方式进行管理:绝对定位或使用布局类. 绝对定位 程序员用像素指定每个控件的位置和尺寸.使用绝对定位时,你必须理解几件事情. ...

  5. 读Pyqt4教程,带你入门Pyqt4 _002

    在这节教程中,我们将创建菜单和工具栏. QMainWindow 类提供应用程序主窗口,可以创建一个经典的拥有状态栏.工具栏和菜单栏的应用程序骨架. 菜单栏 菜单栏是GUI应用程序最明显的部分之一,这是 ...

  6. 读Pyqt4教程,带你入门Pyqt4 _012

    颜色 颜色是指一个代表红(Red).绿(Green).蓝(Blue)(RGB)强度值组合的对象,有效的RGB值在0~255之间.我们可以用多种方式定义颜色,最常用的是RGB十进制或者十六进制值.也可以 ...

  7. 读Pyqt4教程,带你入门Pyqt4 _010

    在PyQt4教程的这部分中,我们讨论拖放操作. 拖放(Drag-and-drop)指的是图形用户界面(Graphical user interface)中,在一个虚拟的对象上按着鼠标键将之拖曳到另一个 ...

  8. 读Pyqt4教程,带你入门Pyqt4 _006

    窗口组件是应用程序的基本构建块.PyQt4编程工具包拥有范围广泛的各种窗口组件.按钮.选择框.滑块.列表框等等,程序员工作所需要的一切.在教程的这部分中,我们将介绍一些有用的窗口组件. QCheckB ...

  9. 读Pyqt4教程,带你入门Pyqt4 _008

    QCalendarWidget QCalendarWidget 提供基于月份的日历窗口组件,它允许用户简单并且直观的选择日期. #!/usr/bin/python # -*- coding: utf- ...

随机推荐

  1. 题解 CF160B 【Unlucky Ticket】

    本文为UserUnknown原创 思路 这道题应该怎么做? 可以把输入的数字逐位拆分后存入数组,就像这样存进去: int a[N],b[N] tmp=n; k=1; while(--tmp){ a[k ...

  2. Eating Everything Efficiently(反向dp)

    传送门 取最大值即可.用拓扑,dfs都可以实现 #include <bits/stdc++.h> using namespace std; const int maxn=500009; i ...

  3. D - Silver Cow Party J - Invitation Cards 最短路

    http://poj.org/problem?id=3268 题目思路: 直接进行暴力,就是先求出举行party的地方到每一个地方的最短路,然后再求以每一个点为源点跑的最短路. 还有一种方法会快很多, ...

  4. Word转pdf,再转图片插入PDF

    WORD转PDF所需jar包: https://yangtaotao.lanzous.com/ice1jlc PDF转图片所需jar包: https://yangtaotao.lanzous.com/ ...

  5. IDEA编写快捷生成代码

    转载于:https://www.jianshu.com/p/029c2de5c612 1. psvm //生成main方法: public static void main(String[] args ...

  6. 李婷华 201771010113 《面向对象程序设计(java)》第一周学习总结

    第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com 薄荷蓝莓 程序设计评测:https://pintia.cn/ 1957877441@q ...

  7. 【Spark】通过SparkStreaming实现从socket接受数据,并进行简单的单词计数

    文章目录 步骤 一.创建maven工程并导入jar包 二.安装并启动生产者 三.开发SparkStreaming代码 四.查看结果 步骤 一.创建maven工程并导入jar包 <properti ...

  8. 【Hadoop离线基础总结】Hadoop的架构模型

    Hadoop的架构模型 1.x的版本架构模型介绍 架构图 HDFS分布式文件存储系统(典型的主从架构) NameNode:集群当中的主节点,主要用于维护集群当中的元数据信息,以及接受用户的请求,处理用 ...

  9. 【Hadoop离线基础总结】MapReduce倒排索引建立

    MapReduce倒排索引建立 求某些单词在文章中出现多少次 有三个文档的内容,求hello,tom,jerry三个单词在其中各出现多少次 hello tom hello jerry hello to ...

  10. Altium Designer PCB封装bug,元件焊盘位置偏移解决方法

    1.问题描述:在拖动几个电阻位置时,意外发现Altium designer20版本软件的一个bug——0805的电阻两焊盘位置发生了偏移,如下图所示. 2.解决办法: ①选中焊盘偏移的封装,右键剪切掉 ...