【问题标题】:QGraphicsView not displaying in QMainWindowQGraphicsView 未在 QMainWindow 中显示
【发布时间】:2011-04-09 12:17:46
【问题描述】:

我不确定为什么这个应用程序没有显示任何内容。我将在几行中重现以提供问题的要点。使用 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_())

这只会显示一个空格。

【问题讨论】:

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

标签: python user-interface qt frameworks pyqt


【解决方案1】:

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

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_())

【讨论】:

  • 谢谢!我认为视图正在取得所有权。
猜你喜欢
  • 2019-07-08
  • 2018-09-14
  • 2018-09-16
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多