Python QGraphicsRecItem是从QGraphicsObject继承的,无法将Rect和setGeometry设置为相同的QRect大小

Python QGraphicsRecItem是从QGraphicsObject继承的,无法将Rect和setGeometry设置为相同的QRect大小,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,QGraphicsRecItem继承自QGraphicsObject,无法将Rect和setGeometry设置为相同的QRect大小 我在设置QGraphicsObject的几何体、位置、宽度和高度以及QGraphicsRectItem的大小时遇到问题 出于特定原因,我需要从QGraphicsObject继承我的QGraphicsRecitem(稍后我需要添加svg图像) 我的工作流程如下 小部件->类外部(父项为“小部件”)->类内部项(父项为“外部”)->文本项(父项为“内部项”) 外面是

QGraphicsRecItem继承自QGraphicsObject,无法将Rect和setGeometry设置为相同的QRect大小

我在设置QGraphicsObject的几何体、位置、宽度和高度以及QGraphicsRectItem的大小时遇到问题

出于特定原因,我需要从QGraphicsObject继承我的QGraphicsRecitem(稍后我需要添加svg图像)

我的工作流程如下

小部件->类外部(父项为“小部件”)->类内部项(父项为“外部”)->文本项(父项为“内部项”)

  • 外面是红色的
  • *InnerItem*为绿色矩形
  • 使用“childrenBoundingRect()”计算“外部”矩形的setRect大小 对于“InnerItem”,类是InnerItem.childboundaryRect(),它应该是TextItem pos、width、height

    我需要绿色矩形框,围绕TextItem绘制,整个绿色矩形框(innerItem)应该是QObject,这是使用SetGeometry完成的

  • 目前,当我单击绿色框的所有侧面时,event.pos()返回 , ) (但图形不在文本框周围)
  • 这是b'cos innerItem.childrenBoundingRect()还将包含 QGraphicsRectitem InnerItem的大小,这可以通过手动重新计算childrenBoundingRect()来克服

    我尝试了许多选项,但我无法将QrecItem和QObject矩形大小设置为相同的大小,如果我设置了,那么event.pos()不会返回,它只会返回 , 关于矩形项的大小之一

    设置QGraphicsRecItem(setRect)和QGraphicsObject(setGeometry)时我做错了什么

    至少在逻辑上,我所尝试的是正确的还是错误的

    我需要像第一张图片和第二张图片这样的东西,这是我得到的:

    class GraphicalView(QtGui.QGraphicsView):
    
        def __init__(self, parent):
            QtGui.QGraphicsView.__init__(self,parent)
            self.setScene(parent)
    
        def mousePressEvent(self, event): 
            self.clickPosition  = self.mapToScene(event.pos())
            print "---------- Start ----------"
            print self.items(event.pos())
    
        def mouseMoveEvent(self,event):
            pass
    
        def mouseReleaseEvent(self, event):
    
            self.clickPosition  = self.mapToScene(event.pos())
            print "MRE ",self.items(event.pos())
            return
    
    class QGObj(QtGui.QGraphicsWidget):
        """Base class for display elemenets in kinetics layout"""
        defaultFontName = "Helvetica"
        defaultFontSize = 10
        name = "ITEM"
        def __init__(self, parent=None):
            QtGui.QGraphicsObject.__init__(self,parent)
            self.gobj = None
            self.pressed = False
            self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable,True)
            self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
            self.setAcceptHoverEvents(True)
    
        def getParentGraphicsObject(self):
            return self.parentItem()
    
        def paint(self, painter=None, option=None, widget = None):
            # painter.setPen(QtGui.QPen(QtGui.QPen(QtCore.Qt.black, 5,Qt.Qt.DashLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)))
            # print " painter in QGrapobj ",self.boundingRect(),self.pos(),self.gobj.boundingRect()
            # painter.drawRect(self.pos().x(),self.pos().y(),self.boundingRect().width(),self.boundingRect().height()) 
            if self.hasFocus() or self.isSelected():
                painter.setPen(QtGui.QPen(QtGui.QPen(QtCore.Qt.black, 1,Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)))
                painter.drawRect(self.boundingRect())        
    
        def itemChange(self,change,value):
            if change == QtGui.QGraphicsItem.ItemSelectedChange and value == True:
                self.emit(QtCore.SIGNAL("qgtextItemSelectedChange(PyQt_PyObject)"),self.mobj)
            return QtGui.QGraphicsItem.itemChange(self,change,value)
    
    
    class InnerItem(QGObj):
    
        def __init__(self,parent):
            QGObj.__init__(self,parent)
            self.gobj = QtGui.QGraphicsRectItem(self)
    
    
        def boundingRect(self):
            ''' reimplimenting boundingRect for redrawning '''
    
            return QtCore.QRectF(self.gobj.boundingRect())
            #return QtCore.QRectF(0,0,self.gobj.boundingRect().width(),self.gobj.boundingRect().height())
    
    class MainWindow(QtGui.QWidget):
    
        def __init__(self, parent = None):
            super(MainWindow, self).__init__(parent)
    
            ## setting up the scene
            self.scene = QtGui.QGraphicsScene(self)
            self.view = GraphicalView(self.scene)
            #self.scene.setSceneRect(0, 0, 500, 500)
    
            ## setting up MyRect
            outer = QtGui.QGraphicsRectItem()
            outer.setPen(QtGui.QPen(Qt.QColor("red"), 5, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin))
    
            ##inner RectItem, 
            ###child of Outer RectItem
            inner = InnerItem(outer)
    
            #textItem which is child of InnerItem class
            textItem  = QtGui.QGraphicsTextItem('My Text Here', inner)
            textItem.setDefaultTextColor(Qt.QColor("blue"))
            textItem.setPos(70,70)
    
    
            inner.gobj.setPen(QtGui.QPen(Qt.QColor("green"), 5, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin))
            innerCBR = inner.childrenBoundingRect()
            #inner.gobj.setRect(0,0,innerCBR.width(),innerCBR.height())
            # print " innerCBR ",innerCBR
            # print inner.childItems()
            # x,y = [],[]
            # for i in inner.childItems():
            #     if not isinstance(i,QtGui.QGraphicsRectItem):
            #         x.append((i.pos().x())+(i.boundingRect().bottomRight().x()))
            #         x.append(i.pos().x())
            #         y.append(i.pos().y()+i.boundingRect().bottomRight().y())
            #         y.append(i.pos().y())
            # innerCBR = QtCore.QRectF(min(x),min(y),max(x)-min(x),max(y)-min(y))
    
            inner.gobj.setRect(0,0,innerCBR.width(),innerCBR.height())
    
            inner.setGeometry(innerCBR.x(),innerCBR.y(),innerCBR.width(),innerCBR.height())
    
            outerCBR = inner.childrenBoundingRect()
            outer.setRect(outerCBR.x()-10,outerCBR.y()-10,outerCBR.width()+20,outerCBR.height()+20)
            self.scene.addItem(outer)
    
    
            layout = QtGui.QHBoxLayout()
            layout.addWidget(self.view)
            self.setLayout(layout) 
    
            self.setWindowTitle("QObj")
            #self.view.fitInView(self.scene.itemsBoundingRect().x()-10,self.scene.itemsBoundingRect().y()-10,self.scene.itemsBoundingRect().width()+20,self.scene.itemsBoundingRect().height()+20,Qt.Qt.IgnoreAspectRatio)
            self.view.show()
    def run():
        app = QtGui.QApplication(sys.argv)
        GUI = MainWindow()
        GUI.show()
        sys.exit(app.exec_())
    
    run()
    


    第一张图片未添加,只是文本周围的绿色框应显示您的问题,请添加缺少的图片。