首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PySide QGraphicsView尺寸

PySide QGraphicsView尺寸
EN

Stack Overflow用户
提问于 2015-08-09 17:22:34
回答 1查看 2.9K关注 0票数 3

我对QGraphicsView有两个问题。

我无法得到QGraphicsView对象的大小。我所使用的所有方法都是给出我所不期望的值。

如果我在右下角(包括滚动条)上打印出鼠标的位置,我会得到一个随机的400值。在将sceneRect设置为500之后,我希望能把它拿回来。

代码语言:javascript
复制
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()

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 19:08:00

关于你的第一个问题,我相信你没有得到你期望的大小,原因有两个:

  1. 您没有显式地将QGraphicsView小部件的大小设置为500,而是将QGraphicsScene设置为500。
  2. 在应用程序的构造过程中,在正确绘制MainWindow布局之前,您正在过早地获取大小。

关于第二个问题,根据需要,可以使用mapFromScene方法获取鼠标事件相对于QGraphicsScene的位置,而不是QGraphicsView小部件。

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

  1. 使用QGraphicsView设置setFixedSize小部件的大小;
  2. 在绘制run方法之后,移动MainWindow方法中的“取大小”调用;
  3. mapToScene坐标上添加一个mouseMoveEvent转换。

以下是对上述各点进行相应修改的代码:

代码语言:javascript
复制
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,正如预期的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31906841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档