在Qt的QGraphicsView中,可以通过重写鼠标事件来实现拖动画图的功能。具体步骤如下:
重写QGraphicsView的mousePressEvent()函数,记录下鼠标按下时的坐标。
重写QGraphicsView的mouseMoveEvent()函数,在该函数中计算出当前鼠标位置相对于上一次记录的位置的偏移量,并将该偏移量应用到场景中所有可选中项(即被设置了ItemIsSelectable属性)的位置上。
在mouseReleaseEvent()函数中清除之前保存的坐标信息。
下面是一个示例代码,演示了如何实现拖动画图的功能:
void MyView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
lastPos = event->pos();
}
}
void MyView::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
QPointF delta = mapToScene(event->pos()) - mapToScene(lastPos);
// 将偏移量应用到场景中所有可选中项的位置上
QList<QGraphicsItem *> items = scene()->selectedItems();
for (int i = 0; i < items.size(); ++i) {
QGraphicsItem *item = items.at(i);
item->moveBy(delta.x(), delta.y());
}
lastPos = event->pos();
}
}
void MyView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
lastPos = QPoint();
}
}
在这个示例中,我们使用了一个lastPos变量来记录上一次鼠标位置。在mousePressEvent()中,我们将其设置为当前鼠标位置;在mouseMoveEvent()中,我们计算出当前鼠标位置相对于上一次记录的位置的偏移量,并将其应用到场景中所有可选中项(即被设置了ItemIsSelectable属性)的位置上;在mouseReleaseEvent()中,我们清除之前保存的坐标信息。
这样就可以实现简单的拖动画图功能了。需要注意的是,如果您希望只有某些项可以被拖动,则需要设置它们的ItemIsMovable属性为true,并且确保它们没有被设置为不可选中(即未被设置ItemIsSelectable属性)。