Qt c++ 图形拖动
时间: 2023-07-10 22:39:38 浏览: 282
QGraphicsView(平移/缩放/旋转)
在 Qt C++ 中,可以使用 QGraphicsView 和 QGraphicsScene 来实现图形的拖动。
首先,需要在窗口中添加一个 QGraphicsView 控件,然后创建一个 QGraphicsScene 对象并将其设置为 QGraphicsView 的场景。接下来,可以向 QGraphicsScene 中添加图形元素,例如 QGraphicsPixmapItem、QGraphicsEllipseItem、QGraphicsRectItem 等。
要实现图形的拖动,可以通过重写 QGraphicsItem 的 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent 函数来实现。在 mousePressEvent 函数中记录鼠标按下时的位置,然后在 mouseMoveEvent 函数中计算鼠标移动的距离并将图形元素移动相应的距离,最后在 mouseReleaseEvent 函数中释放图形元素。
以下是一个简单的示例代码:
```cpp
#include <QtWidgets>
class GraphicsView : public QGraphicsView {
public:
GraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {
QGraphicsScene *scene = new QGraphicsScene(this);
setScene(scene);
QGraphicsEllipseItem *ellipse = new QGraphicsEllipseItem(0, 0, 50, 50);
ellipse->setPos(100, 100);
ellipse->setBrush(Qt::red);
scene->addItem(ellipse);
setDragMode(QGraphicsView::RubberBandDrag);
}
protected:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
QGraphicsItem *item = itemAt(event->pos());
if (item) {
m_item = item;
m_lastPos = event->pos();
}
}
QGraphicsView::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent *event) override {
if (m_item) {
QPointF delta = mapToScene(event->pos()) - mapToScene(m_lastPos);
m_item->moveBy(delta.x(), delta.y());
m_lastPos = event->pos();
}
QGraphicsView::mouseMoveEvent(event);
}
void mouseReleaseEvent(QMouseEvent *event) override {
m_item = nullptr;
QGraphicsView::mouseReleaseEvent(event);
}
private:
QGraphicsItem *m_item = nullptr;
QPoint m_lastPos;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
GraphicsView view;
view.show();
return app.exec();
}
```
在上面的示例代码中,创建了一个 QGraphicsEllipseItem 对象并将其添加到 QGraphicsScene 中。通过设置 QGraphicsView 的拖动模式为 RubberBandDrag,可以实现框选多个图形元素并进行拖动。在 mousePressEvent 函数中记录鼠标按下时的位置,并在 mouseMoveEvent 函数中计算鼠标移动的距离并将图形元素移动相应的距离,最后在 mouseReleaseEvent 函数中释放图形元素。
阅读全文