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_())
这只会显示一个空格。
答
视图是空白的,因为场景已被破坏。如果场景未存储在成员变量中,场景将被销毁。由于场景可以有多个视图,所以该视图并不拥有场景的所有权。在下面的例子中,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
修正了问题,但很奇怪。即使文档指出您可以,您也无法初始化场景中的“视图”。相反,您需要使用默认构造函数,然后手动调用view.setScene(scene)。 – floogads 2010-09-08 02:19:57
这很奇怪。在C++中你的等效代码工作正常。在我的代码中,我将SomeScene(),QHBoxLayout()和QWidget()设置为“self”。 – 2010-09-08 02:51:52