我不明白为什么我会得到 QPainter::begin: Widget painting can only begin as a result of a paintEvent
I don't understand why I'm getting QPainter::begin: Widget painting can only begin as a result of a paintEvent
我一直在查看有关此错误的其他 Whosebug 问题(以及网络上的其他地方),但我不明白这些答案与我的代码有何关系。所以,我希望有一个对我有意义的固定示例,或者更好地解释事件发生的方式和时间。
下面的代码旨在计算出 运行 所在屏幕的尺寸,调整到该尺寸并在占据大部分可用屏幕空间的中心绘制一个圆圈。它试图做更多的事情,但我已经把它精简了——我希望足够了。现在它只是尝试画一个圆。
#!/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 是如何工作的。
已更新
错误消息,正如我所见(遗憾的是 w/o 行号):
$ ./Whosebug.py
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::end: Painter not active, aborted
您需要在 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()
我一直在查看有关此错误的其他 Whosebug 问题(以及网络上的其他地方),但我不明白这些答案与我的代码有何关系。所以,我希望有一个对我有意义的固定示例,或者更好地解释事件发生的方式和时间。
下面的代码旨在计算出 运行 所在屏幕的尺寸,调整到该尺寸并在占据大部分可用屏幕空间的中心绘制一个圆圈。它试图做更多的事情,但我已经把它精简了——我希望足够了。现在它只是尝试画一个圆。
#!/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 是如何工作的。
已更新
错误消息,正如我所见(遗憾的是 w/o 行号):
$ ./Whosebug.py
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::end: Painter not active, aborted
您需要在 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()