2010-09-08 2 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 (сцена) впоследствии. – floogads

+0

Это странно. Эквивалентный код для вашего на C++ отлично работает. В моем коде, однако, я установил родительский «self» для SomeScene(), QHBoxLayout() и QWidget(). –

ответ

2

Вид пуст, потому что сцена была разрушена. Сцена уничтожается, если она не сохраняется в переменной-члене. Представление не получает права владения сценой, поскольку сцена может иметь несколько видов. В приведенном ниже примере tmpScene будет уничтожен (в результате чего будет напечатано сообщение «tmpScene destroy»), но в представлении будет использоваться 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

Смежные вопросы