【问题标题】:Remove scroll functionality on mouse wheel QGraphics view删除鼠标滚轮 QGraphicsview 上的滚动功能
【发布时间】:2018-01-26 03:54:31
【问题描述】:

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

但是,一旦我放大滚动条就会显示出来,并且鼠标滚轮上的滚动功能会覆盖我拥有的缩放功能。

我想知道是否有什么方法可以一起删除滚动并添加拖动以移动选项,或者可能是 CTRL 和鼠标滚轮进行缩放,单独鼠标滚轮可以控制滚动

这是我的缩放功能(我知道这并不完美)但如果有人能对此有所了解,那将是一个奖励

提前喝彩

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您为包含 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);
    };
    

    源文件:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我认为你的问题有一个更简单的答案。要禁用滚动条只需设置滚动条策略(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。在我的大部分代码中,我一开始就直接重新实现它,所以我从来没有想过它具有滚动功能 =))) 对此感到抱歉
        猜你喜欢
        • 2018-06-18
        • 1970-01-01
        • 2011-03-16
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        相关资源
        最近更新 更多