qt c++用QGraphicsItem实现图形只沿着x轴阶梯式拖动
时间: 2023-12-30 10:01:51 浏览: 67
您可以通过重写 `QGraphicsItem` 的 `mouseMoveEvent` 函数来实现只沿着 x 轴阶梯式拖动的效果。
具体实现可以参考以下代码:
```cpp
#include <QGraphicsItem>
#include <QGraphicsSceneMouseEvent>
class CustomGraphicsItem : public QGraphicsItem
{
public:
explicit CustomGraphicsItem(QGraphicsItem* parent = nullptr);
QRectF boundingRect() const override;
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
private:
QPointF m_lastPos;
};
CustomGraphicsItem::CustomGraphicsItem(QGraphicsItem* parent)
: QGraphicsItem(parent)
{
setFlag(QGraphicsItem::ItemIsMovable, true);
}
QRectF CustomGraphicsItem::boundingRect() const
{
return QRectF(0, 0, 100, 100);
}
void CustomGraphicsItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
painter->drawRect(boundingRect());
}
void CustomGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
// 计算 x 方向上的偏移量
qreal dx = event->pos().x() - m_lastPos.x();
// 如果偏移量大于等于 20 或者小于等于 -20,则进行阶梯式拖动
if (dx >= 20 || dx <= -20) {
dx = qRound(dx / 20.0) * 20;
} else {
dx = 0;
}
// 记录当前位置
m_lastPos = event->pos();
// 进行拖动
setPos(pos() + QPointF(dx, 0));
}
```
在上述代码中,我们重写了 `QGraphicsItem` 的 `mouseMoveEvent` 函数,并计算了当前鼠标在 x 方向上的偏移量。如果偏移量大于等于 20 或者小于等于 -20,则进行阶梯式拖动,每次移动 20 个像素。最后,我们通过调用 `QGraphicsItem` 的 `setPos` 函数来实现图形的拖动。
阅读全文