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 &)

PyQt4:将QGraphicsItem调整为固定的QRectF

QRect与QRectF的区别

为啥我的 Cardview 在我运行时没有出现在布局中

为啥我的 geom_vline 对象没有出现在我的绘图中?

为啥我的存储过程没有出现在我的 SQL Server 数据库中?