我不明白为什么我要获取QPainter::Begin:小部件绘制只能作为一个PaintEvent的结果开始 [英] I don't understand why I'm getting QPainter::begin: Widget painting can only begin as a result of a paintEvent

查看:0
本文介绍了我不明白为什么我要获取QPainter::Begin:小部件绘制只能作为一个PaintEvent的结果开始的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究关于这个错误的其他StackOverflow问题(以及Web上的其他问题),但我不明白这些答案与我的代码有什么关系。因此,我希望要么是一个对我有意义的固定例子,要么是对事件如何以及何时发生的更好的解释。

下面的代码旨在计算运行它的屏幕的大小,调整大小,并在占据大部分可用屏幕空间的中心绘制一个圆圈。它试图做更多的事情,但我已经把它精简了--我希望足够了。现在它只是试着画一个圆。

#!/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项目显示和移动正常,但圆圈从未出现。

渐变填充的圆在另一个程序中工作正常,但我无法理解QGraphicsScene和QGraphicsView是如何工作的。

更新

错误消息,与我看到的完全相同(遗憾的是没有行号):

$ ./StackOverflow.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()

这篇关于我不明白为什么我要获取QPainter::Begin:小部件绘制只能作为一个PaintEvent的结果开始的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆