PySide QGraphicsView 大小
PySide QGraphicsView size
我有 2 个关于 QGraphicsView 的问题。
我无法获取 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()
谢谢!
关于您的第一个问题,我相信您没有得到您期望的尺寸,原因有二:
- 您没有将
QGraphicsView
小部件的大小明确设置为 500,而是 QGraphicsScene
。
- 在
MainWindow
的布局正确绘制之前,您在构建应用程序时过早地获取了尺寸。
关于你的第二个问题,根据需要,可以使用方法 mapFromScene 来获取鼠标事件相对于 QGraphicsScene
的位置,而不是 QGraphicsView
小部件。
更具体地说,这可以通过以下方式在您的代码中实现:
- 使用
setFixedSize
设置 QGraphicsView
小部件的大小;
- 移动 "size-fetching" 调用
run
方法,在 MainWindow
绘制完成后;
- 在
mouseMoveEvent
坐标上添加 mapToScene
变换。
下面是根据上面列出的要点相应修改的代码:
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,正如预期的那样。
我有 2 个关于 QGraphicsView 的问题。
我无法获取 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()
谢谢!
关于您的第一个问题,我相信您没有得到您期望的尺寸,原因有二:
- 您没有将
QGraphicsView
小部件的大小明确设置为 500,而是QGraphicsScene
。 - 在
MainWindow
的布局正确绘制之前,您在构建应用程序时过早地获取了尺寸。
关于你的第二个问题,根据需要,可以使用方法 mapFromScene 来获取鼠标事件相对于 QGraphicsScene
的位置,而不是 QGraphicsView
小部件。
更具体地说,这可以通过以下方式在您的代码中实现:
- 使用
setFixedSize
设置QGraphicsView
小部件的大小; - 移动 "size-fetching" 调用
run
方法,在MainWindow
绘制完成后; - 在
mouseMoveEvent
坐标上添加mapToScene
变换。
下面是根据上面列出的要点相应修改的代码:
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,正如预期的那样。