QGraphicsView不显示QGraphicsItems

时间:2010-09-10 04:37:55

标签: python pyqt qgraphicsview qgraphicsitem

使用PyQt4。

我的目标是加载.png的“部分”,将它们分配给QGraphicsItems,将它们添加到场景中,并让QGraphicsView显示它们。 (现在我不关心他们的坐标,我所关心的只是让工作变得健康)。

目前没有显示任何内容。起初我认为添加项目和QGraphicsView没有更新是一个问题,但在阅读了更多关于视口的内容之后,这真的没有意义。所以我测试了在设置视图之前添加QGraphicsView项目(所以我知道它不会是更新问题)并且它仍然没有显示任何内容。路径绝对是正确的。这是一些显示正在发生的事情的代码......

忽略间距问题,粘贴时布局搞砸了

class MainWindow(QtGui.QMainWindow):
 def __init__(self, parent = None):
  QtGui.QMainWindow.__init__(self, parent)

  self.setWindowTitle('NT State Editor')

  winWidth = 1024
  winHeight = 768

  screen = QtGui.QDesktopWidget().availableGeometry()
  screenCenterX = (screen.width() - winWidth) / 2
  screenCenterY = (screen.height() - winHeight) / 2
  self.setGeometry(screenCenterX, screenCenterY, winWidth, winHeight)

  self.tileMap = tilemap.TileMap()
  self.tileBar = tilebar.TileBar()

  mapView = QtGui.QGraphicsView(self.tileMap)
  tileBarView = QtGui.QGraphicsView(self.tileBar)

  button = tilebar.LoadTilesButton()
  QtCore.QObject.connect(button, QtCore.SIGNAL('selectedFile'),
      self.tileBar.loadTiles)

  hbox = QtGui.QHBoxLayout()
  hbox.addWidget(mapView)
  hbox.addWidget(self.tileBarView)
  hbox.addWidget(button)

  mainWidget = QtGui.QWidget()
  mainWidget.setLayout(hbox)

  self.setCentralWidget(mainWidget)


 app = QtGui.QApplication(sys.argv)
 mainWindow = MainWindow()
 mainWindow.show()
 sys.exit(app.exec_())

-

class Tile(QtGui.QGraphicsPixmapItem):
    def __init__(self, parent = None):
        QtGui.QGraphicsPixmapItem(self, parent)
        self.idAttr = -1


class TileBar(QtGui.QGraphicsScene):
    def __init__(self, parent = None):
    QtGui.QGraphicsScene.__init__(self, parent)

    def loadTiles(self, filename):
    tree = ElementTree()
    tree.parse(filename)
    root = tree.getroot()

    sheets = root.findall('sheet')

    for sheet in sheets:
        sheetPath = sheet.get('path')
        sheetImg = QtGui.QImage(sheetPath)

        strips = sheet.findall('strip')
        for strip in strips:
            tile = Tile()
            tile.idAttr = strip.get('id')

            clip = strip.find('clip')
            x = clip.get('x')
            y = clip.get('y')
            width = clip.get('width')
            height = clip.get('height')

            subImg = sheetImg.copy(int(x), int(y), int(width), int(height))
            pixmap = QtGui.QPixmap.fromImage(subImg)
            tile.setPixmap(pixmap)

            self.addItem(tile)

我尝试了将TileBar的'changed()'信号与各种'view'函数连接起来的一些东西,但它们都没有奏效。我在查找使用图形视图框架的方法的好例子时遇到了一些麻烦(大多数都是非常小的规模),所以如果我完全错误的话请告诉我。

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

很难说你的代码有什么问题,因为它不完整,缺少一些部分来编译。虽然有几个地方可能会导致问题:

  1. 您的Title类构造函数;我相信你应该通过执行: QtGui.QGraphicsPixmapItem .__ init __(self,parent)来调用基类构造函数。
  2. 看起来您的图形场景对象正在按钮的onclick信号中构建。您的信号连接到正确的插槽可能会出现问题,如果您的小部件中存在此类问题,您应该在输出中看到警告。
  3. 看起来你正在从xml文件中加载图像文件名,很难检查那里的逻辑是否是直的,但也可能在那里遇到问题。
  4. 下面是代码的简化版本,它将ab图像加载到Title中并将其添加到图形场景中:

    import sys
    from PyQt4 import QtGui, QtCore
    
    class Tile(QtGui.QGraphicsPixmapItem):
        def __init__(self, parent=None):
            QtGui.QGraphicsPixmapItem.__init__(self, parent)
            self.idAttr = -1
    
    class TileBar(QtGui.QGraphicsScene):
        def __init__(self, parent=None):
            QtGui.QGraphicsScene.__init__(self, parent)
    
        #def loadTiles(self, filename):
        def loadTiles(self):
    
            sheetImg = QtGui.QImage("put_your_file_name_here.png")
            pixmap = QtGui.QPixmap.fromImage(sheetImg)
    
            tile = Tile()
            tile.setPixmap(pixmap)
    
            self.addItem(tile)
    
            # skipping your ElementTree parsing logic here
    
    class MainWindow(QtGui.QMainWindow):
        def __init__(self, parent=None):
            QtGui.QMainWindow.__init__(self, parent)
    
            self.setWindowTitle('NT State Editor')
    
            winWidth = 1024
            winHeight = 768
    
            screen = QtGui.QDesktopWidget().availableGeometry()
            screenCenterX = (screen.width() - winWidth) / 2
            screenCenterY = (screen.height() - winHeight) / 2
            self.setGeometry(screenCenterX, screenCenterY, winWidth, winHeight)
    
            #self.tileMap = Tiletilebar.Map()
            self.tileBar = TileBar()
    
            #mapView = QtGui.QGraphicsView(self.tileMap)
            self.tileBarView = QtGui.QGraphicsView(self.tileBar)
    
            #button = self.tilebar.LoadTilesButton()
            button = QtGui.QPushButton() 
            QtCore.QObject.connect(button, QtCore.SIGNAL("clicked()"), 
                                   self.tileBar.loadTiles)
    
            #self.tileBar.loadTiles('some_file_name')
    
            hbox = QtGui.QHBoxLayout()
            #hbox.addWidget(mapView)
            hbox.addWidget(self.tileBarView)
            hbox.addWidget(button)
    
            mainWidget = QtGui.QWidget()
            mainWidget.setLayout(hbox)
    
            self.setCentralWidget(mainWidget)
    
    app = QtGui.QApplication([])
    exm = MainWindow()
    exm.show()
    app.exec_()
    

    希望这有帮助,尊重