qt旋转矩形后,场景中鼠标拖动改变矩形依旧不变 具体例子
时间: 2024-02-23 08:58:36 浏览: 116
可以通过以下步骤实现在场景中旋转矩形后,鼠标拖动改变矩形但不改变旋转角度的效果:
1. 创建一个 QGraphicsRectItem 实例,并将其添加到场景中。
2. 使用 setTransformOriginPoint() 方法设置旋转中心点。
3. 使用 setRotation() 方法设置旋转角度。
4. 为 QGraphicsRectItem 实例添加鼠标事件的处理函数,例如 mousePressEvent() 和 mouseMoveEvent()。
5. 在 mousePressEvent() 中保存鼠标按下时矩形的位置和大小。
6. 在 mouseMoveEvent() 中计算矩形的新位置和大小,并将其应用于 QGraphicsRectItem 实例中,但旋转角度不变。
下面是示例代码:
```cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QMouseEvent>
class MyRectItem : public QGraphicsRectItem {
public:
void mousePressEvent(QGraphicsSceneMouseEvent* event) override {
// 保存鼠标按下时矩形的位置和大小
m_startPos = pos();
m_startRect = rect();
}
void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override {
// 计算矩形的新位置和大小
QPointF delta = event->scenePos() - event->lastScenePos();
QRectF newRect = m_startRect.translated(delta.x(), delta.y());
// 应用新的位置和大小,但旋转角度不变
setRect(newRect);
setPos(m_startPos);
}
private:
QPointF m_startPos;
QRectF m_startRect;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
MyRectItem* rectItem = new MyRectItem;
rectItem->setRect(0, 0, 100, 50);
rectItem->setTransformOriginPoint(50, 25);
rectItem->setRotation(45);
scene.addItem(rectItem);
view.show();
return a.exec();
}
```
在这个示例中,我们创建了一个名为 MyRectItem 的子类,它继承自 QGraphicsRectItem,重写了 mousePressEvent() 和 mouseMoveEvent() 两个函数,实现了鼠标拖动改变矩形但不改变旋转角度的效果。在 main() 函数中,我们创建了一个 MyRectItem 实例,并将其添加到场景中。
阅读全文