pyqt5教程13:客户定制组件
生活随笔
收集整理的這篇文章主要介紹了
pyqt5教程13:客户定制组件
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 說明
PyQt5 有一組豐富的小部件。但是,沒有工具包可以提供程序員在其應(yīng)用程序中可能需要的所有小部件。工具包通常只提供最常見的小部件,如按鈕、文本小部件或滑塊。如果需要更專業(yè)的小部件,我們必須自己創(chuàng)建它。自定義小部件是使用工具包提供的繪圖工具創(chuàng)建的。有兩種基本的可能性:程序員可以修改或增強(qiáng)現(xiàn)有的小部件,或者他可以從頭開始創(chuàng)建自定義小部件。2 PyQt5燒錄的小部件
這是我們可以在 Nero、K3B 或其他 CD/DVD 刻錄軟件中看到的小部件。
custom_widget.py
#!/usr/bin/python""" ZetCode PyQt5 tutorialIn this example, we create a custom widget.Author: Jan Bodnar Website: zetcode.com """from PyQt5.QtWidgets import (QWidget, QSlider, QApplication,QHBoxLayout, QVBoxLayout) from PyQt5.QtCore import QObject, Qt, pyqtSignal from PyQt5.QtGui import QPainter, QFont, QColor, QPen import sysclass Communicate(QObject):updateBW = pyqtSignal(int)class BurningWidget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setMinimumSize(1, 30)self.value = 75self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675]def setValue(self, value):self.value = valuedef paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawWidget(qp)qp.end()def drawWidget(self, qp):MAX_CAPACITY = 700OVER_CAPACITY = 750font = QFont('Serif', 7, QFont.Light)qp.setFont(font)size = self.size()w = size.width()h = size.height()step = int(round(w / 10))till = int(((w / OVER_CAPACITY) * self.value))full = int(((w / OVER_CAPACITY) * MAX_CAPACITY))if self.value >= MAX_CAPACITY: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 = 0for i in range(step, 10 * step, step):qp.drawLine(i, 0, i, 5)metrics = qp.fontMetrics()fw = metrics.width(str(self.num[j]))x, y = int(i - fw/2), int(h / 2)qp.drawText(x, y, str(self.num[j]))j = j + 1class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):OVER_CAPACITY = 750sld = QSlider(Qt.Horizontal, self)sld.setFocusPolicy(Qt.NoFocus)sld.setRange(1, OVER_CAPACITY)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()def main():app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()在我們的示例中,我們有一個(gè) QSlider 和一個(gè)自定義小部件。滑塊控制自定義小部件。此小部件以圖形方式顯示介質(zhì)的總?cè)萘亢臀覀兛捎玫目捎每臻g。我們自定義小部件的最小值為 1,最大值為 OVER_CAPACITY。如果我們達(dá)到 MAX_CAPACITY 值,我們開始繪制紅色。這通常表示過度燃燒。
刻錄小部件位于窗口底部。這是使用
one?QHBoxLayout?and one?QVBoxLayout.
class BurningWidget(QWidget):def __init__(self):super().__init__()基于 QWidget 小部件的刻錄小部件。
self.setMinimumSize(1, 30)我們更改小部件的最小尺寸(高度)。默認(rèn)值對我們來說有點(diǎn)小。
font = QFont('Serif', 7, QFont.Light) qp.setFont(font) 我們使用比默認(rèn)字體更小的字體。這更符合我們的需求。 size = self.size() w = size.width() h = size.height()step = int(round(w / 10))till = int(((w / OVER_CAPACITY) * self.value)) full = int(((w / OVER_CAPACITY) * MAX_CAPACITY)) 我們動(dòng)態(tài)地繪制小部件。窗口越大,刻錄小部件越大,反之亦然。這就是為什么我們必須計(jì)算在其上繪制自定義小部件的小部件的大小。直到參數(shù)確定要繪制的總大小。該值來自滑塊小部件。它是整個(gè)區(qū)域的一部分。 full 參數(shù)決定了我們開始繪制紅色的點(diǎn)。實(shí)際繪圖包括三個(gè)步驟。我們繪制黃色或紅色和黃色的矩形。然后我們繪制將小部件分成幾個(gè)部分的垂直線。最后,我們畫出表示介質(zhì)容量的數(shù)字。 metrics = qp.fontMetrics() fw = metrics.width(str(self.num[j]))x, y = int(i - fw/2), int(h / 2) qp.drawText(x, y, str(self.num[j])) 我們使用字體度量來繪制文本。我們必須知道文本的寬度才能使其圍繞垂直線居中。 def changeValue(self, value):self.c.updateBW.emit(value)self.wid.repaint() 當(dāng)我們移動(dòng)滑塊時(shí),會調(diào)用 changeValue 方法。在方法內(nèi)部,我們發(fā)送一個(gè)帶有參數(shù)的自定義 updateBW 信號。該參數(shù)是滑塊的當(dāng)前值。該值稍后用于計(jì)算要繪制的 Burning 小部件的容量。然后重新繪制自定義小部件。Figure: The burning widget
總結(jié)
以上是生活随笔為你收集整理的pyqt5教程13:客户定制组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyqt5教程12:拖放功能
- 下一篇: 射影几何笔记4:证明的思路