2016-11-29 9 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의 작동 방식을 알 수 없습니다.

업데이트] 내가 (줄 번호 O를 슬프게/W)를 참조 정확하게

오류 메시지 :

$ ./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

이상한 나는 정확히 내가 달리고있는 것을 올렸고, 이제 나는 얻을 수있는 유일한 오류 메시지를 첨부했다. (그리고 나는 그것을 최소한의 실행 예제로 만들기 위해 최선을 다했다. 나는 그것에서 많은 것을 제거했다.) 그러나 나는 같은 오류를 얻기 위해 내가 없앨 수있는 다른 것을 볼 것이다. – 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()