gpt4 book ai didi

qt - QGraphicsItem 验证位置更改

转载 作者:行者123 更新时间:2023-12-04 15:27:17 24 4
gpt4 key购买 nike

我有一个自定义 QGraphicsItem 实现。我需要能够限制可以移动项目的位置 - 即将其限制在某个区域。当我检查 Qt 文档时,这是它的建议:

QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QRectF rect = scene()->sceneRect();
if (!rect.contains(newPos)) {
// Keep the item inside the scene rect.
newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
return newPos;
}
}
return QGraphicsItem::itemChange(change, value);
}

所以基本上,检查传递给itemChange的位置,如果你不喜欢它,改变它并返回新值。

看起来很简单,但它实际上不起作用。当我检查调用堆栈时,我看到正在从 QGraphicsItem::setPos 调用 itemChange,但它甚至不查看返回值。所以我没有任何目的返回一个改变的位置,没有人在看它。查看 QGraphicsItem.cpp 中的代码
// Notify the item that the position is changing.
const QVariant newPosVariant(itemChange(ItemPositionChange, qVariantFromValue<QPointF>(pos)));
QPointF newPos = newPosVariant.toPointF();
if (newPos == d_ptr->pos)
return;

// Update and repositition.
d_ptr->setPosHelper(newPos);

// Send post-notification.
itemChange(QGraphicsItem::ItemPositionHasChanged, newPosVariant);
d_ptr->sendScenePosChange();

有什么建议?我希望避免使用鼠标按下鼠标移动等方式自己重新实现整个点击和拖动行为......,但我想如果我找不到更好的主意,我将不得不这样做。

最佳答案

我实际上没有尝试过,但在我看来它正在检查返回位置。返回的受限仓位用于 newPosVariant 的构造函数中转换为 newPos .如果项目与当前项目不同,则使用它来设置项目的位置。

关于qt - QGraphicsItem 验证位置更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4330666/

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