禁用鼠标滚轮在QGraphics View中的滚动功能

10
我在我的窗口部件上有一个 QGraphicsView 窗口,并且刚刚添加了鼠标滚轮事件,用于放大图像。
然而,一旦我放大了,滚动条就会显示出来,鼠标滚轮上的滚动功能会覆盖我的缩放功能。
我想知道是否有任何方法可以完全删除滚动并添加拖动选项,或者使用 CTRL 和鼠标滚轮进行缩放,并使单独的鼠标滚轮控制滚动。
这是我的缩放函数(我知道它不完美),但如果有人能提供一些指导,那就更好了。
提前致谢。
void Test::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0)
    {
        ui->graphicsView->scale(2,2);
    }
    else
    {
        ui->graphicsView->scale(0.5,0.5);
    }
}
3个回答

7

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

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

不幸的是,这会禁用所有滚动,这意味着如果您在缩放后使用滚动条来实现填充,那么这将破坏它。 - GPhilo

6

您重新实现了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);
};

源文件:

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);
       }
    }
}

1

我认为你的问题有一个比较简单的答案.. 要禁用滚动条,只需设置滚动条策略(QGraphicsView就是QScrollView),所以步骤1)

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

这将禁用滚动条。

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

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

那是获得您想要的结果的最快方式


是的,你可能是对的,正如之前的答案所述,你应该重新实现wheelEvent。在我的大多数代码中,我会直接在开头重新实现它,所以我从来没有想过它有滚动功能=))) 对此感到抱歉。 - evilruff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接