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

Ang*_*uck 6 c++ qt

我的小部件上有一个QGraphicsView窗口,只是放入一个鼠标滚轮的事件,放大图像.

但是,只要我放大滚动条,鼠标滚轮上的滚动功能就会覆盖我的缩放功能.

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

这是我的缩放功能(我意识到并不完美),但如果有人可以说明这将是一个奖金

提前喝彩

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

Ily*_*kiy 6

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

您可以从 QGraphicsView 派生,为派生类重新实现wheelEvent 并使用派生类而不是QGraphicsView - 这样您甚至不需要在QWidget/QMainWindow 中使用wheelEvent,并且您可以自定义重新实现的wheelEvent 来执行您想要的操作。类似的东西:

头文件:

class myQGraphicsView : public QGraphicsView
{
public:
    myQGraphicsView(QWidget * parent = nullptr);
    myQGraphicsView(QGraphicsScene * scene, QWidget * parent = nullptr);

protected:
    virtual void wheelEvent(QWheelEvent * event);
};
Run Code Online (Sandbox Code Playgroud)

源文件:

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);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)


psy*_*pod 6

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

    ui->graphicsView->verticalScrollBar()->blockSignals(true);
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->horizontalScrollBar()->blockSignals(true);
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Run Code Online (Sandbox Code Playgroud)