c++ - 如何在 QGraphicsView 中平移图像

标签 c++ qt graphics qgraphicsview

我目前能够将我的图像加载到图形场景中,然后再次加载到 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/

相关文章:

python向量*向量------>矩阵

java - 如何旋转绘图面板中绘制的一系列线条和形状?

多文件 C++ 链表

c++ - 为什么强类型枚举可以用没有static_cast的整数初始化?

c++ - 如何为 QListView 中列表项的边框设置动画?

c++ - 如何在Qt的QGraphicsView中创建任意大小的点?

c++ - 将 IARG_MEMORYREAD_EA 与 PIN_SafeCopy 结合使用

c++ - 为什么重画窗口后人物的影子还在那里?

c++ - 让 QObject 在执行函数之前等待它的监听器

java - 在宾果纸牌游戏中实现 Java 图形