我不明白为什么我得到QPainter :: begin:Widget绘画只能从paintEvent

时间:2016-11-29 17:42:53

标签: python pyqt pyside qgraphicsview qgraphicsscene

我一直在查看有关此错误的其他StackOverflow问题(以及网络上的其他地方),但我不了解答案与我的代码的关系。所以,我希望找到一个对我有意义的固定例子,或者更好地解释事件发生的方式和时间。

下面的代码旨在弄清楚它正在运行的屏幕的尺寸,调整大小并在中心画一个占据大部分可用屏幕空间的圆圈。它试图做更多,但我已经将其剥离 - 我希望足够。现在它只是想画一个圆圈。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import sys

from PySide.QtCore import *
from PySide.QtGui  import *


class Viewport(QGraphicsView):

    def __init__(self, parent=None):
        super(Viewport, self).__init__(parent)

        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)

    def paintEvent(self, event):
        super(Viewport, self).paintEvent(event)

        qp = QPainter()
        qp.begin(self)
        square = QRect(10, 10, 30, 30)
        qp.drawEllipse(square)
        qp.end()


class UI(QDialog):

    def __init__(self, parent=None):
        super(UI, self).__init__(parent)

        self.view = Viewport(self)
        gridLayout = QGridLayout()
        gridLayout.addWidget(self.view, 0, 0, 1, 1)
        self.setLayout(gridLayout)

    def resizeEvent(self, event):
        super(UI, self).resizeEvent(event)
        self.view.setFrameShape(QFrame.NoFrame)
        self.view.setSceneRect(0, 0, 400, 400)
        self.view.setFixedSize(400, 400)


app = QApplication(sys.argv)

ui = UI()
ui.show()

sys.exit(app.exec_())

以上内容被删除了破坏的代码,该代码具有移动的SVG项目,并且该圆圈最初具有渐变填充。 SVG项目显示并移动正常但圆圈从未出现过。

渐变填充圆在另一个程序中工作得很好,当时它是由一个用于QGroupBox的paintEvent绘制的,但是我无法理解QGraphicsScene和QGraphicsView是如何工作的。

已更新

错误信息,正如我所看到的那样(遗憾的是没有行号):

$ ./StackOverflow.py
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::end: Painter not active, aborted

1 个答案:

答案 0 :(得分:1)

你需要在viewport()

上画画
    def paintEvent(self, event):
        super(Viewport, self).paintEvent(event)

        qp = QPainter()
        qp.begin(self.viewport())

        square = QRect(10, 10, 30, 30)
        qp.drawEllipse(square)
        qp.end()