2010-09-08 122 views
1

我不知道爲什麼這個應用程序沒有顯示任何東西。我會複製幾行以提供問題的要點。使用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

回答

2

視圖是空白的,因爲場景已被破壞。如果場景未存儲在成員變量中,場景將被銷燬。由於場景可以有多個視圖,所以該視圖並不擁有場景的所有權。在下面的例子中,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