2016-11-29 19 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的工作方式。

修訂

錯誤消息,正是因爲我看到它(可悲的是W/O行號):

$ ./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() 
相關問題