QRectF 没有出现在我的 QGraphicsScene 中
Posted
技术标签:
【中文标题】QRectF 没有出现在我的 QGraphicsScene 中【英文标题】:QRectF doesn't appear in my QGraphicsScene 【发布时间】:2019-04-04 06:28:33 【问题描述】:我正在尝试使用 QGraphicsView(在 Maya 中)并获得了一些我将在下面粘贴的代码。问题是带有 QGraphicsView 的窗口来了,但看起来 QGraphicsScene(with my QRectF) 没有来。我仍然有点困惑继承是如何工作的,所以有人可以指出我在哪里做错了。谢谢。
from PySide2 import QtGui, QtCore, QtWidgets
from shiboken2 import wrapInstance
import maya.OpenMaya as om
import maya.OpenMayaUI as omui
import maya.cmds as cmds
import os, functools
def getMayaWindow():
pointer = omui.MQtUtil.mainWindow()
if pointer is not None:
return wrapInstance(long(pointer), QtWidgets.QWidget)
class testUi(QtWidgets.QDialog):
def __init__(self, parent=None):
if parent is None:
parent = getMayaWindow()
super(testUi, self).__init__(parent)
self.window = 'vl_test'
self.title = 'Test Remastered'
self.size = (1000, 650)
self.create()
def create(self):
if cmds.window(self.window, exists=True):
cmds.deleteUI(self.window, window=True)
self.setWindowTitle(self.title)
self.resize(QtCore.QSize(*self.size))
self.testik = test(self)
self.mainLayout = QtWidgets.QVBoxLayout()
self.mainLayout.addWidget(self.testik)
self.setLayout(self.mainLayout)
class test(QtWidgets.QGraphicsView):
def __init__(self, parent=None):
super(test, self).__init__(parent)
self._scene = QtWidgets.QGraphicsScene()
rect_item = QtWidgets.QGraphicsRectItem(QtCore.QRectF(0, 0, 100, 100))
rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self._scene.addItem(rect_item)
v = testUi()
v.show()
【问题讨论】:
【参考方案1】:问题是你没有将QGraphicsScene添加到QGraphicsView中:
class test(QtWidgets.QGraphicsView):
def __init__(self, parent=None):
super(test, self).__init__(parent)
self._scene = QtWidgets.QGraphicsScene()
self.setScene(self._scene) # <---
rect_item = QtWidgets.QGraphicsRectItem(QtCore.QRectF(0, 0, 100, 100))
rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self._scene.addItem(rect_item)
【讨论】:
【参考方案2】:Eyllanesc 是正确的,您已经创建了 QGraphicsScene
,但您仍需要将其设置为 QGraphicsView
。
查看QGraphicsView's constructor 的文档,您还可以通过其__init__
参数之一传递场景:QGraphicsView.__init__ (self, QGraphicsScene scene, QWidget parent = None)
因此您可以保存一行并将其设置为直接传递给您班级的super
:
class test(QtWidgets.QGraphicsView):
def __init__(self, scene, parent=None):
self._scene = QtWidgets.QGraphicsScene() # Create scene first.
super(test, self).__init__(self._scene, parent) # Pass scene to the QGraphicsView's constructor method.
rect_item = QtWidgets.QGraphicsRectItem(QtCore.QRectF(0, 0, 100, 100))
rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self._scene.addItem(rect_item)
【讨论】:
以上是关于QRectF 没有出现在我的 QGraphicsScene 中的主要内容,如果未能解决你的问题,请参考以下文章
将文件加载到 drawBackground(QPainter *painter, const QRectF &)