Python QGraphicsRecItem是从QGraphicsObject继承的,无法将Rect和setGeometry设置为相同的QRect大小
QGraphicsRecItem继承自QGraphicsObject,无法将Rect和setGeometry设置为相同的QRect大小 我在设置QGraphicsObject的几何体、位置、宽度和高度以及QGraphicsRectItem的大小时遇到问题 出于特定原因,我需要从QGraphicsObject继承我的QGraphicsRecitem(稍后我需要添加svg图像) 我的工作流程如下 小部件->类外部(父项为“小部件”)->类内部项(父项为“外部”)->文本项(父项为“内部项”)Python QGraphicsRecItem是从QGraphicsObject继承的,无法将Rect和setGeometry设置为相同的QRect大小,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,QGraphicsRecItem继承自QGraphicsObject,无法将Rect和setGeometry设置为相同的QRect大小 我在设置QGraphicsObject的几何体、位置、宽度和高度以及QGraphicsRectItem的大小时遇到问题 出于特定原因,我需要从QGraphicsObject继承我的QGraphicsRecitem(稍后我需要添加svg图像) 我的工作流程如下 小部件->类外部(父项为“小部件”)->类内部项(父项为“外部”)->文本项(父项为“内部项”) 外面是
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()
第一张图片未添加,只是文本周围的绿色框应显示您的问题,请添加缺少的图片。