如何基于QTimer更新QPainter像素图

问题描述 投票:1回答:1

我想根据QTimer在每个刻度上连续旋转QPainter像素图-在此示例中为时钟臂。我可以旋转时钟臂,但是我没有使旋转动态化的技能。这是我想制作的时钟,下面是我的示例代码。让我知道您能否在此过程中为我提供帮助,谢谢!

enter image description here

import sys
import random 

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.label = QtWidgets.QLabel()
        self.setCentralWidget(self.label)

        self.Clock_pixmap = QtGui.QPixmap("clock.png")
        self.Arm_pixmap = QtGui.QPixmap("clockarm.png")
        self.painter = QtGui.QPainter(self.Clock_pixmap)
        self.painter.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)
        self.painter.drawPixmap(QtCore.QPoint(), self.Arm_pixmap)
        self.painter.end()
        self.label.setPixmap(self.Clock_pixmap.scaled(self.label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
        self.label.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        self.label.setMinimumSize(150, 150) 

        self.w1 = self.Arm_pixmap.width()/2
        self.h1 = self.Arm_pixmap.height()/2

        self.rotationData = random.sample(range(100), 100)

        timer = QtCore.QTimer(self, timeout=self.rotateArm, interval=100)
        timer.start()

        self.n=0

    def rotateArm(self):
        self.n+=1
        self.painter.translate(self.w1,self.h1)
        self.painter.rotate(self.rotationData[self.n])
        self.painter.translate(-self.w1,-self.h1)
        self.update()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
python pyqt5 qpainter qpixmap qtimer
1个回答
2
投票

您正在使用QPainter进行绘制,因为您使用了end()方法,因此表明已完成绘制。因此,不必为QPainter设置类属性,而只需为局部变量设置类属性。考虑到上述情况,解决方案是:

import sys
import random

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._angle = 0

        self.label = QtWidgets.QLabel()
        self.setCentralWidget(self.label)

        self.clock_pixmap = QtGui.QPixmap("clock.png")
        self.arm_pixmap = QtGui.QPixmap("clockarm.png")

        rotation_data = random.sample(range(100), 100)
        self.data_iter = iter(rotation_data)

        timer = QtCore.QTimer(self, timeout=self.rotate_arm, interval=100)
        timer.start()

    def rotate_arm(self):
        try:
            angle = next(self.data_iter)
        except StopIteration:
            pass
        else:
            self.draw(angle)

    def draw(self, angle):
        pixmap = self.clock_pixmap.copy()
        painter = QtGui.QPainter(pixmap)
        painter.setRenderHints(
            QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform
        )
        painter.translate(pixmap.rect().center())
        painter.rotate(angle)
        painter.translate(-pixmap.rect().center())
        painter.drawPixmap(QtCore.QPoint(), self.arm_pixmap)
        painter.end()
        self.label.setPixmap(pixmap)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.