7

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

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

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

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

提前欢呼

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

3 回答 3

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

源文件:

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);
       }
    }
}
于 2013-04-19T14:46:04.493 回答
6

Scrolling can be disabled with the following code:

    ui->graphicsView->verticalScrollBar()->blockSignals(true);
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->horizontalScrollBar()->blockSignals(true);
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
于 2014-08-19T20:21:02.867 回答
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);

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

于 2013-04-19T16:45:12.267 回答