2016-11-29 16 views
0

Я смотрел на другие вопросы StackOverflow относительно этой ошибки (и в других местах в Интернете), но я не понимаете, как ответы относятся к моему коду. Таким образом, я надеюсь на то, что для меня имеет смысл какой-то фиксированный пример, или лучшее объяснение того, как и когда происходят события.Я не понимаю, почему я получаю QPainter :: begin: Виджетная картина может начинаться только в результате paintEvent

Код, приведенный ниже, предназначался для определения размеров экрана, на котором он работает, измените его размер и нарисуйте круг в центре, который занимает большую часть доступной экранной недвижимости. Он попытался сделать намного больше, но я убрал его - я надеюсь. Теперь он просто пытается нарисовать круг.

#!/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 отображался и двигался хорошо, но круг никогда не появлялся.

Круг, заполненный градиентом, отлично работал в другой программе, когда он был нарисован paintEvent для QGroupBox, но я не могу понять, как работают QGraphicsScene и QGraphicsView.

ОБНОВЛЕНО

сообщение об ошибке, точно так, как я это вижу (к сожалению, без номеров строк):

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

Я не могу запустить код прямо сейчас, можете ли вы указать, в какой строке возникает исключение? Также подтвердите, что вы получаете исключение с кодом точно так же, как и вы опубликовали. – Schollii

+0

Подготовьте минимальный пример, показывающий ошибку. В настоящий момент код не запускается из-за некоторых других, возможно, несвязанных проблем. – Trilarion

+0

Нечетные. Я отправил точно, что я запускаю, и теперь я добавил единственное сообщение об ошибке, которое я получил. (И я делал все возможное, чтобы сделать его минимальным примером. Я удалил LOT из него.) Но я посмотрю, что еще я смогу избавиться, чтобы получить ту же ошибку. – Ubuntourist

ответ

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()