PyQt5中文基础教程11 自定义控件
来源:互联网 发布:mac怎么关机 编辑:程序博客网 时间:2024/06/02 00:09
PyQt5有丰富的组件,但是还是满足不了所有开发者的所有需求的,PyQt5只提供了基本的组件,像按钮,文本,滑块等。如果你还需要其他的模块,应该尝试自己去自定义一些。
自定义组件使用绘画工具创建,有两个基本方式:根据已有的创建或改进;通过自己绘图创建。
Burning widget
这个组件我们会在Nero,K3B,或者其他CD/DVD烧录软件中见到。
#!/usr/bin/python3# -*- coding: utf-8 -*-"""ZetCode PyQt5 tutorial In this example, we create a custom widget.author: Jan Bodnarwebsite: zetcode.com last edited: January 2015"""import sysfrom PyQt5.QtWidgets import (QWidget, QSlider, QApplication, QHBoxLayout, QVBoxLayout)from PyQt5.QtCore import QObject, Qt, pyqtSignalfrom PyQt5.QtGui import QPainter, QFont, QColor, QPenclass Communicate(QObject): updateBW = pyqtSignal(int)class BurningWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setMinimumSize(1, 30) self.value = 75 self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675] def setValue(self, value): self.value = value def paintEvent(self, e): qp = QPainter() qp.begin(self) self.drawWidget(qp) qp.end() def drawWidget(self, qp): font = QFont('Serif', 7, 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(QColor(255, 255, 255)) qp.setBrush(QColor(255, 255, 184)) qp.drawRect(0, 0, full, h) qp.setPen(QColor(255, 175, 175)) qp.setBrush(QColor(255, 175, 175)) qp.drawRect(full, 0, till-full, h) else: qp.setPen(QColor(255, 255, 255)) qp.setBrush(QColor(255, 255, 184)) qp.drawRect(0, 0, till, h) pen = QPen(QColor(20, 20, 20), 1, Qt.SolidLine) qp.setPen(pen) qp.setBrush(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 + 1class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): sld = QSlider(Qt.Horizontal, self) sld.setFocusPolicy(Qt.NoFocus) sld.setRange(1, 750) sld.setValue(75) sld.setGeometry(30, 40, 150, 30) self.c = Communicate() self.wid = BurningWidget() self.c.updateBW[int].connect(self.wid.setValue) sld.valueChanged[int].connect(self.changeValue) hbox = QHBoxLayout() hbox.addWidget(self.wid) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300, 300, 390, 210) self.setWindowTitle('Burning widget') self.show() def changeValue(self, value): self.c.updateBW.emit(value) self.wid.repaint()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
本例中,我们使用了QSlider
和一个自定义组件,由进度条控制。显示的有物体(也就是CD/DVD)的总容量和剩余容量。进度条的范围是1~750。如果值达到了700,就显示为红色,代表了烧毁了的意思。
烧录组件在窗口的底部,这个组件是用QHBoxLayout
和QVBoxLayout
组成的。
class BurningWidget(QWidget): def __init__(self): super().__init__()
烧录组件是基于QWidget
组件做的。
self.setMinimumSize(1, 30)
修改组件进度条的高度,默认的有点小了。
font = QFont('Serif', 7, 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))
动态的渲染组件,随着窗口的大小而变化,这就是我们计算窗口大小的原因。最后一个参数决定了组件的最大范围,进度条的值是由窗口大小按比例计算出来的。最大值的地方填充的是红色。注意这里使用的是浮点数,能提高计算和渲染的精度。
绘画由三部分组成,黄色或红色区域和黄色矩形,然后是分割线,最后是添上代表容量的数字。
metrics = qp.fontMetrics()fw = metrics.width(str(self.num[j]))qp.drawText(i-fw/2, h/2, str(self.num[j]))
We use font metrics to draw the text. We must know the width of the text in order to center it around the vertical line.
def changeValue(self, value): self.c.updateBW.emit(value) self.wid.repaint()
When we move the slider, the changeValue() method is called. Inside the method, we send a custom updateBW signal with a parameter. The parameter is the current value of the slider. The value is later used to calculate the capacity of the Burning widget to be drawn. The custom widget is then repainted.
- PyQt5中文基础教程11 自定义控件
- PyQt5中文基础教程7 控件1
- PyQt5中文基础教程8 控件2
- PyQt5中文基础教程1 简介
- PyQt5中文基础教程6 对话框
- PyQt5中文基础教程9 拖拽
- PyQt5中文基础教程10 绘图
- pyQt5-自定义控件
- PyQt5中文基础教程2 Hello World
- PyQt5中文基础教程3 菜单栏和工具栏
- PyQt5中文基础教程4 布局管理
- PyQt5中文基础教程5 事件和信号
- PyQt5中文基础教程12 俄罗斯方块游戏
- PyQt5教程-22-自定义控件
- PyQt5教程(十)——自定义控件
- pyQt5-控件1
- pyQt5-控件2
- python3+PyQt5 自定义视图
- 如何永久性开启adb 的root权限
- 你知道Android界的Kotlin嘛?---什么该留?什么该去?
- 百行代码打造高级联动特效
- bool 变量想为什么一般初始化为FALSE 比较好?
- USB HID 描述符
- PyQt5中文基础教程11 自定义控件
- EDL:一种轻量级的视觉着色技术
- javascript学习笔记三【函数的三种角色】
- python学习笔记(一)
- 【二叉树】二叉树反转【Add to List 226. Invert Binary Tree】
- Spring Boot(5)一个极简且完整的后台框架
- Linux 如何打开端口
- 学习总结笔记
- 【怎样写代码】偷窥高手 -- 反射技术(五):深入窥视方法