2017-06-30 4 views
0

私はPyQt5で基本的なゲームループを作成しようとしています。私はその中にQWidgetQGraphicsViewを持っています。私はQTimerupdate()を使ってとQGraphicsViewpaintEvent()をトリガーします。 QWidgetpaintEvent()は更新されますが、QGraphicsViewpaintEvent()は更新されません。ここでQt5 paintEvent子ウィジェットへの伝達

は私のコードです:

import sys, random 

from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QGraphicsView, QGraphicsScene 
from PyQt5.QtCore import Qt, QTimer 
from PyQt5.QtGui import QPainter, QColor, QPen, QBrush, QColor 



class Window(QWidget): 

    WIDTH = 800 
    HEIGHT = 480 
    SPEED = 500 

    def __init__(self): 

     super().__init__() 
     self.initUi() 
     self.initDisplay() 
     self.show() 

    def initUi(self): 

     layout = QGridLayout() 

     scene = GraphicsScene()   
     self.view = GraphicsView() 
     self.view.setScene(scene) 

     layout.addWidget(self.view) 
     self.setLayout(layout) 


    def initDisplay(self):  

     self.resize(Window.WIDTH, Window.HEIGHT) 

     self.timer = QTimer() 
     self.timer.setInterval(Window.SPEED) 
     self.timer.timeout.connect(self.timerEvent) 
     self.isStarted = False 
     self.isPaused = False 

     self.timer.start() 


    def start(self): 

     if self.isPaused: 
      return 

     self.isStarted = True 
     self.timer.start(Display.SPEED) 


    def pause(self): 

     if not self.isStarted: 
      return 

     self.isPaused = not self.isPaused 

     if self.isPaused: 
      self.timer.stop()    
     else: 
      self.timer.start(Display.SPEED) 

     self.update() 


    def paintEvent(self, event): 
     print('paint event ...') 


    def timerEvent(self): 
     self.update() 
     self.view.update() 
     print('timer event ...') 



class GraphicsView(QGraphicsView): 


    def __init__(self): 
     super(GraphicsView, self).__init__() 


    def paintEvent(self, event): 
     self.scene().add_shapes() 
     print('view paint event') 



class GraphicsScene(QGraphicsScene): 

    def __init__(self): 
     super(GraphicsScene, self).__init__() 


    def add_shapes(self): 

     self.setSceneRect(0.0, 0.0, 800.0, 640.0) 

     self.addRect(100, 100, 150, 150) 

     pen = QPen(Qt.SolidLine) 
     pen.setColor(Qt.red) 
     brush = QBrush(Qt.Dense3Pattern) 
     brush.setColor(Qt.darkGreen) 
     self.addEllipse(300, 300, 100, 100, pen, brush) 
     print('add shapes')   



if __name__ == '__main__': 

    app = QApplication([]) 
    window = Window()  
    sys.exit(app.exec_()) 

私はスクリプトを実行すると、私は次のような出力が得られます。

paint event ... 
add shapes 
view paint event 
paint event ... 
add shapes 
view paint event 
timer event ... 
paint event ... 
paint event ... 
timer event ... 
paint event ... 
paint event ... 
timer event ... 
paint event ... 
paint event ... 
timer event ... 
paint event ... 
paint event ... 
timer event ... 
paint event ... 
paint event ... 

答えて

0

ソリューションは、このような場合には(基本クラスのpaintEvent()を呼び出すことですQGraphicsView

import sys, random 

from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QGraphicsView, QGraphicsScene 
from PyQt5.QtCore import Qt, QTimer 
from PyQt5.QtGui import QPainter, QColor, QPen, QBrush, QColor 



class Window(QWidget): 

    WIDTH = 800 
    HEIGHT = 480 
    SPEED = 500 

    def __init__(self): 

     super().__init__() 
     self.initUi() 
     self.initDisplay() 
     self.show() 

    def initUi(self): 

     layout = QGridLayout() 

     self.scene = GraphicsScene() 
     self.view = GraphicsView(self, self.scene) 

     layout.addWidget(self.view) 
     self.setLayout(layout) 


    def initDisplay(self):  

     self.resize(Window.WIDTH, Window.HEIGHT) 

     self.timer = QTimer() 
     self.timer.setInterval(Window.SPEED) 
     self.timer.timeout.connect(self.timerEvent) 
     self.isStarted = False 
     self.isPaused = False 

     self.timer.start() 


    def start(self): 

     if self.isPaused: 
      return 

     self.isStarted = True 
     self.timer.start(Display.SPEED) 


    def pause(self): 

     if not self.isStarted: 
      return 

     self.isPaused = not self.isPaused 

     if self.isPaused: 
      self.timer.stop()    
     else: 
      self.timer.start(Display.SPEED) 

     self.update() 


    def paintEvent(self, event): 
     print('paint event ...') 


    def timerEvent(self): 
     self.update() 
     self.view.update() 
     self.scene.update() 
     print('timer event ...') 



class GraphicsView(QGraphicsView): 


    def __init__(self, parent, scene): 

     super(GraphicsView, self).__init__() 
     self.scene = scene 
     self.parent = parent 
     self.setScene(self.scene) 


    def paintEvent(self, event): 
     QGraphicsView.paintEvent(self, event)######### 
     self.setScene(self.scene) 
     self.scene.add_shapes() 
     print('view paint event') 



class GraphicsScene(QGraphicsScene): 

    def __init__(self): 
     super(GraphicsScene, self).__init__() 


    def add_shapes(self): 

     self.setSceneRect(0.0, 0.0, 700.0, 450.0) 

     self.addRect(100, 100, 150, 150) 

     pen = QPen(Qt.SolidLine) 
     pen.setColor(Qt.red) 
     brush = QBrush(Qt.Dense3Pattern) 
     brush.setColor(Qt.darkGreen) 
     self.addEllipse(300, 300, 100, 100, pen, brush) 
     print('add shapes')   



if __name__ == '__main__': 

    app = QApplication([]) 
    window = Window()  
    sys.exit(app.exec_()) 
関連する問題