PySide QGraphicsView大小

时间:2015-08-09 17:22:35

标签: python pyside qgraphicsview

我在QGraphicsView上有2个问题。

我无法获得QGraphicsView对象的大小。我使用的所有方法都给了我无法预期的价值。

如果我在区域的右下角(包括滚动条)打印出鼠标位置,我会得到一个随机的400值。在将sceneRect设置为500之后,我期待得到它。

from PySide import QtGui, QtCore

class View(QtGui.QGraphicsView):
    def __init__(self, parent = None):
        super(View, self).__init__(parent)
        self.setScene( QtGui.QGraphicsScene(self) )
        self.setSceneRect( 0, 0, 500, 500 )

        print self.viewport().width() # outputs 96
        print self.width() # outputs 100
        print self.rect() # outputs QRect(0, 0, 100, 30)
        print self.size() # outputs QSize(100, 30)

    def mouseMoveEvent(self, event):
        print event.pos().toTuple() # prints (413, 423) at lower-right corner

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.resize(500, 500)

        self.view = View(self)
        hLayout = QtGui.QHBoxLayout()
        hLayout.addWidget(self.view)

        buttonsLayout = QtGui.QVBoxLayout()
        buttonsLayout.setSpacing(0)
        for i in range(10):
            newButton = QtGui.QPushButton()
            buttonsLayout.addWidget(newButton)
        hLayout.addLayout(buttonsLayout)

        self.tempButton = QtGui.QPushButton()

        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addLayout(hLayout)
        mainLayout.addWidget(self.tempButton)
        self.setLayout(mainLayout)

    def run(self):
        self.show()

win = MainWindow()
win.run()

谢谢!

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题,我相信你没有达到你期望的尺寸,原因有两个:

  1. 您没有明确地将QGraphicsView窗口小部件的大小设置为500,而是QGraphicsScene代替。
  2. 在正确绘制MainWindow的布局之前,您在构建应用程序时过早地获取大小。
  3. 关于您的第二个问题,根据需要,可以使用mapFromScene方法获取与QGraphicsScene而不是QGraphicsView相关的鼠标事件的位置小部件。

    更具体地说,这可以通过以下方式在您的代码中实现:

    1. 使用QGraphicsView设置setFixedSize窗口小部件的大小;
    2. 移动"取尺寸"在run被绘制之后,在MainWindow方法中调用;
    3. mapToScene坐标上添加mouseMoveEvent转换。
    4. 以下是根据上面列出的点进行修改的代码:

      from PySide import QtGui, QtCore
      import sys
      
      class View(QtGui.QGraphicsView):
          def __init__(self, parent = None):
              super(View, self).__init__(parent)
              self.setScene(QtGui.QGraphicsScene(self) )
              self.setSceneRect( 0, 0, 1000, 1000 )
              self.setFixedSize(500, 500)
      
          def mouseMoveEvent(self, event):
              print
              print self.mapToScene(event.pos()).toTuple() 
              # prints (1000, 1000) at lower-right corner
              print event.pos().toTuple()
              # prints (500, 500) at lower-right corner
      
      class MainWindow(QtGui.QWidget):
          def __init__(self):
              super(MainWindow, self).__init__()
      
              self.view = View(self)
      
              hLayout = QtGui.QHBoxLayout()
              hLayout.addWidget(self.view)
      
              buttonsLayout = QtGui.QVBoxLayout()
              buttonsLayout.setSpacing(0)
              for i in range(10):
                  newButton = QtGui.QPushButton()
                  buttonsLayout.addWidget(newButton)
              hLayout.addLayout(buttonsLayout)
      
              self.tempButton = QtGui.QPushButton()
      
              mainLayout = QtGui.QVBoxLayout()
              mainLayout.addLayout(hLayout)
              mainLayout.addWidget(self.tempButton)
              self.setLayout(mainLayout)
      
          def run(self):
              self.show()  
              print
              print self.view.viewport().width() # outputs 485
              print self.view.width() # outputs 500
              print self.view.rect() # outputs QRect(0, 0, 500, 500)
              print self.view.size() # outputs QSize(500, 500)
              print self.view.sceneRect() #outputs QRect(0, 0, 1000, 1000)
      
      if __name__ == '__main__':
      
          app = QtGui.QApplication(sys.argv)
      
          win = MainWindow()  
          win.run()  
      
          sys.exit(app.exec_())
      

      使用上面的代码,QGraphicView大小返回的值为500x500,而QGraphicsScene的值为1000x1000,正如预期的那样。