QGraphicsView不显示在QMainWindow中

问题描述:

我不知道为什么这个应用程序没有显示任何东西。我会复制几行以提供问题的要点。使用PyQt4QGraphicsView不显示在QMainWindow中

class SomeScene(QtGui.QGraphicsScene): 
    def __init__(self, parent = None): 
     QtGui.QGraphicsScene.__init__(self, parent) 

     pixmap = QtGui.QPixmap('someImage') # path is DEFINITELY valid 
     item = QGraphicsPixmapItem(pixmap) 
     self.addItem(item) 


class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     QtGui.QMainWindow.__init__(self, parent) 
     ... # code to set up window 

     scene = SomeScene() 
     view = QtGui.QGraphicsView(scene) 

     hbox = QtGui.QHBoxLayout() 
     hbox.addWidget(view) 

     mainWidget = QtGui.QWidget() 
     mainWidget.setLayout(hbox) 

     self.setCentralWidget(mainWidget) 


app = QtGui.QApplication(sys.argv) 
mainWindow = MainWindow() 
mainWindow.show() 
sys.exit(app.exec_()) 

这只会显示一个空格。

+0

修正了问题,但很奇怪。即使文档指出您可以,您也无法初始化场景中的“视图”。相反,您需要使用默认构造函数,然后手动调用view.setScene(scene)。 – floogads 2010-09-08 02:19:57

+0

这很奇怪。在C++中你的等效代码工作正常。在我的代码中,我将SomeScene(),QHBoxLayout()和QWidget()设置为“self”。 – 2010-09-08 02:51:52

视图是空白的,因为场景已被破坏。如果场景未存储在成员变量中,场景将被销毁。由于场景可以有多个视图,所以该视图并不拥有场景的所有权。在下面的例子中,tmpScene将被销毁(导致“tmpScene销毁”消息被打印),但self.scene将在视图中使用并且pixmap项目将被显示。

import sys 
from PyQt4 import QtGui 
import sip 

class SomeScene(QtGui.QGraphicsScene): 
    def __init__(self, parent = None): 
     QtGui.QGraphicsScene.__init__(self, parent) 

     pixmap = QtGui.QPixmap('someImage') 
     item = QtGui.QGraphicsPixmapItem(pixmap) 
     self.addItem(item) 


class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     QtGui.QMainWindow.__init__(self, parent) 

     # This scene will be destroyed because it is local. 
     tmpScene = SomeScene() 
     tmpScene.destroyed.connect(self.onSceneDestroyed) 

     self.scene = SomeScene() 
     view = QtGui.QGraphicsView(self.scene) 

     hbox = QtGui.QHBoxLayout() 
     hbox.addWidget(view) 

     mainWidget = QtGui.QWidget() 
     mainWidget.setLayout(hbox) 

     self.setCentralWidget(mainWidget) 

    def onSceneDestroyed(self, obj): 
     print 'tmpScene destroyed' 

app = QtGui.QApplication(sys.argv) 
mainWindow = MainWindow() 
mainWindow.show() 
sys.exit(app.exec_()) 
+0

谢谢!我认为这个观点正在获得所有权。 – floogads 2010-09-09 01:14:27