【发布时间】:2018-12-12 16:16:58
【问题描述】:
我有一个基本上是圆形的小部件。我想逐步绘制它,所以我需要逐步绘制它(imo)。
通过以下代码,我已经实现了我想要的。但是,有一个问题。我将 新事件 传递给 paintEvent 函数,因为如果我不这样做,图像在一切完成之前不会更新,所以我没有得到任何想要的结果。
小部件代码
import sys
import time
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QDesktopWidget
from PyQt5.QtGui import QPen, QPainter, QPaintEvent, QConicalGradient, QColor, QBrush
class Circle(QWidget):
def __init__(self, size, color):
super().__init__()
self.loadingAngle = 0
self.width = 0
self.color = color
self.pixmap_opacity = 1
self.resize(size, size);
self.center()
self.initUI()
def initUI(self):
self.width = 15
self.loadingAngle = 0
self.show()
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def paintEvent(self, qevent):
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setStyleSheet("background:transparent;")
drawingRect = QRect()
drawingRect.setX(qevent.rect().x() + self.width)
drawingRect.setY(qevent.rect().y() + self.width)
drawingRect.setWidth(qevent.rect().width() - self.width * 2)
drawingRect.setHeight(qevent.rect().height() - self.width * 2)
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
gradient = QConicalGradient()
gradient.setCenter(drawingRect.center())
gradient.setAngle(90)
gradient.setColorAt(1, QColor(0,0,0))
gradient.setColorAt(0, QColor(self.color[0], self.color[1],self.color[2]))
arcLengthApproximation = self.width + self.width / 3
pen = QPen(QBrush(gradient), self.width)
pen.setCapStyle(Qt.RoundCap)
painter.setPen(pen)
painter.drawArc(drawingRect, 90 * 16 - arcLengthApproximation, -self.loadingAngle * 16)
#time.sleep(0.25)
if self.loadingAngle < 360:
self.loadingAngle += 1
#self.paintEvent(QDrawEvent())
self.paintEvent(QPaintEvent())
有问题的行
self.paintEvent(QPaintEvent())
这条线产生了几个错误,但即使有它们,我也会做我想做的。
如果我将函数本身的
qevent传递给这个新调用,图像不会像我之前所说的那样得到更新。如果我创建这个新的
QPaintEvent,它确实有效。但是,错误是:
Traceback(最近一次通话最后一次):
文件“/home/btc/Escritorio/SinestesiaRCB/Clases/Widget.py”,第 68 行,在 paintEvent self.paintEvent(QPaintEvent())
TypeError:参数不匹配任何重载调用: QPaintEvent(QRegion): 没有足够的参数
QPaintEvent(QRect): 没有足够的参数
QPaintEvent(QPaintEvent): 没有足够的参数
QBackingStore::endPaint() 在 backingstore 绘制设备上使用活动绘制器调用
这些错误可能来自其他行,例如:
qevent.rect().x()
因为新事件是空的。
所以基本上我的问题是,我应该怎么做才能正确地做到这一点,这意味着没有错误地实现我想要的?
PS。我所说的渐进式。这已经创建了几个小部件,每个小部件都在前一秒之后。
【问题讨论】:
标签: python pyqt pyqt5 qpainter paintevent