在qt场景中根据鼠标的拖动来旋转矩形
时间: 2023-12-10 16:37:19 浏览: 74
Qt鼠标拖动绘制基本几何图形(直线、矩形、圆形、椭圆)
5星 · 资源好评率100%
在Qt中,您可以使用QGraphicsView和QGraphicsScene来创建一个场景,并在场景中添加一个矩形。要根据鼠标的拖动来旋转矩形,您可以重写QGraphicsView的mousePressEvent,mouseMoveEvent和mouseReleaseEvent函数来捕获鼠标事件,并使用QTransform来旋转矩形。
下面是一个示例代码,展示如何在Qt场景中根据鼠标的拖动来旋转矩形:
```cpp
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QMouseEvent>
#include <QTransform>
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QWidget *parent = nullptr)
: QGraphicsView(parent)
{
QGraphicsScene *scene = new QGraphicsScene(this);
QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 50);
rectItem->setFlag(QGraphicsItem::ItemIsMovable, true);
rectItem->setFlag(QGraphicsItem::ItemIsSelectable, true);
scene->addItem(rectItem);
setScene(scene);
}
protected:
void mousePressEvent(QMouseEvent *event) override
{
QGraphicsView::mousePressEvent(event);
if (event->button() == Qt::LeftButton && scene()->selectedItems().count() > 0) {
QPointF pos = mapToScene(event->pos());
m_rotationCenter = scene()->selectedItems().at(0)->boundingRect().center();
m_startAngle = QLineF(m_rotationCenter, pos).angle();
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
QGraphicsView::mouseMoveEvent(event);
if (event->buttons() & Qt::LeftButton && scene()->selectedItems().count() > 0) {
QPointF pos = mapToScene(event->pos());
qreal angle = QLineF(m_rotationCenter, pos).angle() - m_startAngle;
QTransform transform;
transform.rotate(angle);
foreach (QGraphicsItem *item, scene()->selectedItems()) {
item->setTransform(item->transform() * transform);
}
}
}
private:
QPointF m_rotationCenter;
qreal m_startAngle;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GraphicsView view;
view.show();
return a.exec();
}
```
在这个示例代码中,我们创建了一个名为GraphicsView的自定义QGraphicsView类,并在构造函数中创建了一个QGraphicsScene和一个QGraphicsRectItem,然后将其添加到场景中。我们还将QGraphicsRectItem的ItemIsMovable和ItemIsSelectable标志设置为true,以启用矩形的拖动和选择。
在mousePressEvent函数中,我们检查是否按下了鼠标的左键,并且有一个项目被选择。如果是这样,我们记录旋转中心的位置和开始的角度。
在mouseMoveEvent函数中,我们检查是否按下了鼠标的左键,并且有一个项目被选择。如果是这样,我们计算鼠标移动的角度,并使用QTransform将该角度应用于选择的所有项目的转换中。
最后,我们使用main函数创建一个GraphicsView对象并显示它。
阅读全文