2016-11-29 8 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のアイテムは表示され、動いていましたが、サークルは決して表示されませんでした。

グラデーションが塗りつぶされた円は、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 
+0

私はそれを見ているエラーメッセージを正確に、(悲しいことにW/O行番号)を更新します今すぐコードを実行することはできません。例外が発生する行を指定できますか?また、投稿したコードとまったく同じコードで例外が発生していることを確認してください。 – Schollii

+0

エラーを示す最小限の実行例を準備してください。現在のところ、コードは他のおそらく無関係な問題のために実行されません。 – Trilarion

+0

奇数私は実行しているものを正確に投稿しました。私は今、唯一のエラーメッセージを添付しました。 (そして、私はそれを最小限の実行例にするために最善を尽くしていました。私はそれから多くを取り除きました。)しかし、私は同じエラーを得るために他のものを取り除くことができます。 – 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() 
関連する問題