Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QGraphicsView未显示在QMainWindow中_Python_User Interface_Qt_Frameworks_Pyqt - Fatal编程技术网

Python QGraphicsView未显示在QMainWindow中

Python QGraphicsView未显示在QMainWindow中,python,user-interface,qt,frameworks,pyqt,Python,User Interface,Qt,Frameworks,Pyqt,我不知道为什么这个应用程序没有显示任何内容。我将用几行文字来阐述这个问题的要点。使用PyQt4 class SomeScene(QtGui.QGraphicsScene): def __init__(self, parent = None): QtGui.QGraphicsScene.__init__(self, parent) pixmap = QtGui.QPixmap('someImage') # path is DEFINITELY valid

我不知道为什么这个应用程序没有显示任何内容。我将用几行文字来阐述这个问题的要点。使用PyQt4

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 destroming”消息),但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_())

修正了问题,但很奇怪。您无法使用场景初始化“视图”,即使文档表明您可以。相反,您需要使用默认构造函数,然后手动调用view.setScene(场景)。这很奇怪。C++中的等效代码工作正常。但在我的代码中,我将SomeScene()、QHBoxLayout()和QWidget()的父项设置为“self”。谢谢!我认为这是一种观点。