0

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()」シグナルをさまざまな「ビュー」関数に接続していくつか試してみましたが、どれも機能しませんでした。Graphics View Framework を使用する方法の良い例を見つけるのに少し苦労しました (ほとんどは非常に小規模です)。完全に間違っている場合はお知らせください。

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

1

コードが完全ではなく、コンパイルするためにいくつかの部分が欠けているため、コードの何が問題なのかを判断するのは非常に困難です。問題を引き起こす可能性のある場所がいくつかありますが:

  1. Title クラスのコンストラクター。QtGui.QGraphicsPixmapItem.__init__(self, parent)を実行して、そこで基本クラスのコンストラクターを呼び出す必要があると思います。
  2. ボタンの onclick シグナルでグラフィック シーン オブジェクトが構築されているようです。適切なスロットに接続する信号に問題がある可能性があります。ウィジェットにそのような問題がある場合は、出力に警告が表示されます。
  3. xml ファイルから画像ファイル名を読み込んでいるようです。あちらのロジックがまっすぐかどうかを確認するのは非常に困難ですが、そこにも問題がある可能性があります。

以下は、タイトルに ab 画像を読み込み、グラフィック シーンに追加するコードの簡略化されたバージョンです。

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

これが役に立てば幸いです、よろしく

于 2010-09-11T00:11:10.280 に答える