【问题标题】:I don't understand why I'm getting QPainter::begin: Widget painting can only begin as a result of a paintEvent我不明白为什么我得到 QPainter::begin: 小部件绘画只能作为 paintEvent 的结果开始
【发布时间】:2017-04-13 19:53:50
【问题描述】:

我一直在查看有关此错误的其他 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

【问题讨论】:

  • 我现在无法运行代码,你能指出异常是在哪一行引发的吗?另外,请确认您收到的异常代码与您发布的代码完全相同。
  • 请准备一个显示错误的最小运行示例。现在代码由于其他一些可能不相关的问题而无法运行。
  • 奇数。我准确地发布了我正在运行的内容,现在我附上了我收到的唯一错误消息。 (我正在尽最大努力使它成为一个最小的运行示例。我从中删除了很多内容。)但我会看看我还能摆脱什么来得到同样的错误。
  • 我从上面的代码中删除了更多内容。我仍然收到我发布的相同错误消息。

标签: python pyqt pyside qgraphicsview qgraphicsscene


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2012-05-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多