我目前能够将我的图像加载到图形场景中,然后再次加载到 QGraphicsViewer。
我可以通过检测 QEvent::Wheel 然后调用 graphicsViews 的 scale() 函数来实现缩放功能。
但是,我似乎无法弄清楚如何使平移功能正常工作。我基本上想检测鼠标何时单击图像,然后随着鼠标向左、向右、向上或向下移动图像。
到目前为止,我基本上有一个 MouseFilter 类来检测事件,并根据事件类型执行不同的操作。我将该监听器附加到 QGraphicsView 对象
最佳答案
如果有人想知道如何自己做,其实很简单。这是我的应用程序中的代码:
class ImageView : public QGraphicsView
{
public:
ImageView(QWidget *parent);
~ImageView();
private:
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
bool _pan;
int _panStartX, _panStartY;
};
你需要存储拖动的起始位置,比如像这样(我用的是右键):
void ImageView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton)
{
_pan = true;
_panStartX = event->x();
_panStartY = event->y();
setCursor(Qt::ClosedHandCursor);
event->accept();
return;
}
event->ignore();
}
此外,您需要在释放按钮后清除标志并恢复光标:
void ImageView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton)
{
_pan = false;
setCursor(Qt::ArrowCursor);
event->accept();
return;
}
event->ignore();
}
要真正管理拖动,您需要覆盖鼠标移动事件。 QGraphicsView 继承了一个 QAbstractScrollArea,它的滚动条很容易访问。您还需要更新平移位置:
void ImageView::mouseMoveEvent(QMouseEvent *event)
{
if (_pan)
{
horizontalScrollBar()->setValue(horizontalScrollBar()->value() - (event->x() - _panStartX));
verticalScrollBar()->setValue(verticalScrollBar()->value() - (event->y() - _panStartY));
_panStartX = event->x();
_panStartY = event->y();
event->accept();
return;
}
event->ignore();
}
关于c++ - 如何在 QGraphicsView 中平移图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753681/