删除鼠标滚轮QGraphics视图上的滚动功能

Remove scroll functionality on mouse wheel QGraphics view

本文关键字:滚动 功能 视图 QGraphics 鼠标 删除      更新时间:2023-10-16

我在我的小部件上有一个QGraphicsView窗口,并且刚刚为鼠标滚轮放置了一个事件,该事件放大了图像。

然而,只要我缩放滚动条显示,鼠标滚轮上的滚动功能覆盖了我的缩放功能。

我想知道是否有任何方法可以将滚动全部删除,并添加拖动移动选项,或者可能是CTRL和鼠标滚轮缩放和鼠标滚轮单独控制滚动

这是我的缩放功能(我知道它并不完美),但如果有人能给一些启示,这将是一个奖金

提前干杯

void Test::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0)
    {
        ui->graphicsView->scale(2,2);
    }
    else
    {
        ui->graphicsView->scale(0.5,0.5);
    }
}

可以使用以下代码禁用滚动:

    ui->graphicsView->verticalScrollBar()->blockSignals(true);
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->horizontalScrollBar()->blockSignals(true);
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

您重新实现了包含QGraphicsView的QWidget/QMainWindow的wheelEvent,然而,QGraphicsView的wheelEvent保持不变。

你可以从QGraphicsView派生,重新实现车轮事件的派生类和使用派生类代替QGraphicsView -这样你甚至不需要在你的QWidget/QMainWindow的车轮事件,你可以自定义重新实现车轮事件做你想要的。像这样:

头文件:

class myQGraphicsView : public QGraphicsView
{
public:
    myQGraphicsView(QWidget * parent = nullptr);
    myQGraphicsView(QGraphicsScene * scene, QWidget * parent = nullptr);
protected:
    virtual void wheelEvent(QWheelEvent * event);
};
源文件:

myQGraphicsView::myQGraphicsView(QWidget * parent)
: QGraphicsView(parent) {}
myQGraphicsView::myQGraphicsView(QGraphicsScene * scene, QWidget * parent)
: QGraphicsView(scene, parent) {}
void myQGraphicsView::wheelEvent(QWheelEvent * event)
{
    // your functionality, for example:
    // if ctrl pressed, use original functionality
    if (event->modifiers() & Qt::ControlModifier)
    {
        QGraphicsView::wheelEvent(event);
    }
    // otherwise, do yours
    else
    {
       if (event->delta() > 0)
       {
           scale(2, 2);
       }
       else
       {
           scale(0.5, 0.5);
       }
    }
}

我想你的问题有一个更简单的答案…要禁用滚动条,只需设置滚动条策略(QGraphicsView只是QScrollView),所以步骤1)

setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

将禁用滚动条…

步骤2)(如果你想保持简单)

QGraphicsView * pView;  // pointer to your graphics view
pView->setInteractive(true);
pView->setDragMode(QGraphicsView::ScrollHandDrag);

这是获得你想要的结果的最快方法