Python PySide QGraphicsView尺寸

Python PySide QGraphicsView尺寸,python,pyside,qgraphicsview,Python,Pyside,Qgraphicsview,我对QGraphicsView有两个问题 我无法获取QGraphicsView对象的大小。我使用的所有方法都给了我意想不到的价值 如果我打印出鼠标在区域右下角的位置(包括滚动条),我会得到一个随机的400值。在设置为500后,我希望能恢复到原来的水平 from PySide import QtGui, QtCore class View(QtGui.QGraphicsView): def __init__(self, parent = None): super(View

我对QGraphicsView有两个问题

我无法获取QGraphicsView对象的大小。我使用的所有方法都给了我意想不到的价值

如果我打印出鼠标在区域右下角的位置(包括滚动条),我会得到一个随机的400值。在设置为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()

谢谢大家!

关于你的第一期,我认为你没有得到你期望的尺寸,原因有两个:

  • 您没有明确地将
    QGraphicsView
    小部件的大小设置为500,而是将
    qgraphicscene
    设置为500
  • 在构建应用程序时,在正确绘制
    main窗口
    的布局之前,获取大小太早了
  • 关于第二个问题,根据需要,可以使用该方法获取鼠标事件相对于
    qgraphicscene
    而不是
    QGraphicsView
    小部件的位置

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

  • 使用
    setFixedSize
    设置
    QGraphicsView
    小部件的大小
  • 在绘制
    main窗口
    后,在
    run
    方法中移动“大小获取”调用
  • mouseMoveEvent
    坐标上添加
    maptosene
    转换
  • 以下是根据上述要点修改的代码:

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

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

    感谢您的精彩解释!