gpt4 book ai didi

python - 使用 itemChange() 限制 QGraphicsItem

转载 作者:行者123 更新时间:2023-12-05 04:08:36 25 4
gpt4 key购买 nike

我正在使用 pyqt 和 Python 3。我想防止 QGraphicsRectItem 在用鼠标拖动时穿过 QGraphicsScene 中的水平轴 (y=0)。我正在使用以下代码(使用 height() 因为矩形位于屏幕的上半部分)。请参阅下面的完整代码示例。

import sys
from PyQt4.QtCore import Qt, QPointF
from PyQt4.QtGui import QGraphicsRectItem, QGraphicsLineItem, QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem

class MyRect(QGraphicsRectItem):
def __init__(self, w, h):
super().__init__(0, 0, w, h)
self.setFlag(QGraphicsItem.ItemIsMovable, True)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemIsFocusable, True)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)

def itemChange(self, change, value):
if change == QGraphicsItem.ItemPositionChange:
if self.y() + self.rect().height() > 0:
return QPointF(self.x(), -self.rect().height())
return value

def main():
# Set up the framework.
app = QApplication(sys.argv)
gr_view = QGraphicsView()
scene = QGraphicsScene()
scene.setSceneRect(-100, -100, 200, 200)
gr_view.setScene(scene)

# Add an x-axis
x_axis = QGraphicsLineItem(-100, 0, 100, 0)
scene.addItem(x_axis)

# Add the restrained rect.
rect = MyRect(50, 50)
rect.setPos(-25, -100) # <--- not clear to me why I have to do this twice to get the
rect.setPos(-25, -100) # item positioned. I know it has to do with my itemChanged above...
scene.addItem(rect)

gr_view.fitInView(0, 0, 200, 200, Qt.KeepAspectRatio)
gr_view.show()
sys.exit(app.exec_())

if __name__ == '__main__':
main()

原则上这是可行的,但是当我一直在水平轴 (y=0) 下方拖动鼠标时,矩形在拖动时会闪烁并在鼠标位置和它在上半平面中的约束位置之间来回跳跃。所以看起来像拖动先将其移动到鼠标光标,然后才追溯调整位置。我希望在完全(明显地)移动项目之前进行调整。

最佳答案

您使用 self.y() + self.rect().height() > 0 来测试该项目是否仍在 y 轴上方。但是,self.y() 指的是旧/当前位置。您应该改为使用 value.y() 测试新位置。

所以方法应该是:

def itemChange(self, change, value):
if change == QGraphicsItem.ItemPositionChange:
if value.y() + self.rect().height() > 0:
return QPointF(value.x(), -self.rect().height())
return super().itemChange(change, value) # Call super

请注意,如果测试通过,我将返回 value.x(),如果测试失败,则调用父类的 itemChange(就像 itemChange Qt documentation 中的 C++ 示例一样) )

关于python - 使用 itemChange() 限制 QGraphicsItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47216468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com