Python 根据子对象的位置调整QGraphicsItem的大小';调整器';项目
我正在尝试创建一个最小的QGraphicsItem,它充当其父级的大小调整器。我想我就快到了,但我正在画一个空白,以及如何在移动父项时将其位置传递给父项。我想要的东西看起来像这样(没有文字): 这是一个到目前为止我所拥有的完整的例子:Python 根据子对象的位置调整QGraphicsItem的大小';调整器';项目,python,c++,qt,pyqt,qgraphicsitem,Python,C++,Qt,Pyqt,Qgraphicsitem,我正在尝试创建一个最小的QGraphicsItem,它充当其父级的大小调整器。我想我就快到了,但我正在画一个空白,以及如何在移动父项时将其位置传递给父项。我想要的东西看起来像这样(没有文字): 这是一个到目前为止我所拥有的完整的例子: import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class Resizer(QGraphicsEllipseItem): def __init__(self, rect
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class Resizer(QGraphicsEllipseItem):
def __init__(self, rect=QRectF(0, 0, 10, 10), parent=None, scene=None):
super().__init__(rect, parent, scene)
self.setFlag(QGraphicsItem.ItemIsMovable, True)
def mousePressEvent(self, mouseEvent):
self.resize = True
self.initialPos = self.scenePos()
self.setSelected(True)
def mouseMoveEvent(self, mouseEvent):
if self.resize:
self.currentPos = self.scenePos()
self.change = self.initialPos - self.currentPos
super().mouseMoveEvent(mouseEvent)
def mouseReleaseEvent(self, mouseEvent):
self.resize = False
self.setSelected(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
view = QGraphicsView()
scene = QGraphicsScene()
scene.setSceneRect(0, 0, 500, 500)
view.setScene(scene)
rect = QRectF(100, 100, 150, 50)
box = QGraphicsRectItem(rect)
scene.addItem(box)
resizer = Resizer(parent=box)
resizerWidth = resizer.rect().width() / 2
resizerOffset = QPointF(resizerWidth, resizerWidth)
resizer.setPos(box.rect().bottomRight() - resizerOffset)
view.show()
sys.exit(app.exec_())
那么,如何将mouseMoveEvent
中的self.change
传递给父对象,使其在移动大小调整器时调整大小?欢迎提出任何其他建议
我已尝试将大小调整器
转换为QGraphicsObject
的子类,以便它可以在mouseMoveEvent
上发出信号,但QGraphicsObject
没有绘制方法,我不确定如何在场景中显示大小调整器
欢迎对此提供任何建议。我结束了将Resizer
类转换为QGraphicsObject
的子类的过程。事实证明,重新实现绘制方法是可能的(即使我的自动完成之前没有找到它)
Resizer.itemChange
现在发出一个信号,该信号分配给父Box
类中的resize
方法,该类使用Resizer中的位置更改信息来调整长方体的矩形
通过这种方式,也可以为其他项目恢复大小调整器,而无需重新实现所提供答案中的鼠标按下/移动/释放事件
@我有点同意。不过我解决这个问题的方法有点不同。我正在张贴我的答案,以防它可能是有用的。发布一个好的解决方案有它自己的好处。但是如果你把它贴到原来的问题上(如果你确信这是一个新的有价值的答案),那么你可能会得到更多的意见(有更多意见的老问题在谷歌搜索上索引更多)。下次注意。@BhargavRao太好了!谢谢你的建议,我会在原版发布。现在不要这样做。下次记住这一点。
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class Box(QGraphicsRectItem):
def __init__(self, position, rect=QRectF(0, 0, 100, 50), parent=None, scene=None):
super().__init__(rect, parent, scene)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemIsMovable, True)
self.setFlag(QGraphicsItem.ItemIsFocusable, True)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)
self.setPos(position)
self.resizer = Resizer(parent=self)
resizerWidth = self.resizer.rect.width() / 2
resizerOffset = QPointF(resizerWidth, resizerWidth)
self.resizer.setPos(self.rect().bottomRight() - resizerOffset)
self.resizer.resizeSignal.connect(self.resize)
def paint(self, painter, option, widget=None):
pen = QPen()
pen.setColor(Qt.black)
painter.setPen(pen)
painter.setBrush(Qt.transparent)
painter.drawRect(self.rect())
@pyqtSlot()
def resize(self, change):
self.setRect(self.rect().adjusted(0, 0, change.x(), change.y()))
self.prepareGeometryChange()
self.update()
class Resizer(QGraphicsObject):
resizeSignal = pyqtSignal(QPointF)
def __init__(self, rect=QRectF(0, 0, 10, 10), parent=None):
super().__init__(parent)
self.setFlag(QGraphicsItem.ItemIsMovable, True)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)
self.rect = rect
def boundingRect(self):
return self.rect
def paint(self, painter, option, widget=None):
if self.isSelected():
pen = QPen()
pen.setStyle(Qt.DotLine)
painter.setPen(pen)
painter.drawEllipse(self.rect)
def itemChange(self, change, value):
if change == QGraphicsItem.ItemPositionChange:
if self.isSelected():
self.resizeSignal.emit(value - self.pos())
return value
if __name__ == "__main__":
app = QApplication(sys.argv)
view = QGraphicsView()
scene = QGraphicsScene()
scene.setSceneRect(0, 0, 500, 1000)
view.setScene(scene)
box = Box(QPointF(50, 50), scene=scene)
view.show()
sys.exit(app.exec_())