滚动条通过焦点捕捉轮子事件?

时间:2014-02-26 20:58:32

标签: c++ qt scroll scrollbar

我根据此example创建了一个可滚动的图像查看器。 我使用QLabel,QImage和QScrollArea。

我想使用QWheelEvent放大和缩小。

我的问题是,只有当滚动条位于顶部或底部时才会发出事件,否则只会滚动图像。

有什么想法吗?

·H

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QLabel>
#include <QHBoxLayout>
#include <QScrollArea>
#include <QWheelEvent>
#include <QScrollBar>

class MyWidget : public QWidget
{
    Q_OBJECT

    QLabel* _label;
    QHBoxLayout* _layout;
    QScrollArea* _scrollArea;

    double _factor;
public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();
protected:
    void wheelEvent(QWheelEvent* e);
};

#endif // MYWIDGET_H

的.cpp

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QImage im("D:\\parrot_1366.jpg");

    _label = new QLabel;
    _label->setPixmap(QPixmap::fromImage(im));
    _label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    _label->setScaledContents(true);

    _layout = new QHBoxLayout;
    _scrollArea = new QScrollArea;
    _scrollArea->setWidget(_label);

    _layout->addWidget(_scrollArea);
    setLayout(_layout);

    _factor = 1.0;
}

MyWidget::~MyWidget()
{

}

void MyWidget::wheelEvent(QWheelEvent *e)
{
    QScrollBar* scrollbarHor = _scrollArea->horizontalScrollBar();
    QScrollBar* scrollbarVer = _scrollArea->verticalScrollBar();

    QPoint degree = e->angleDelta() / 8;

    double f;
    if (degree.y() < 0)
    {
        _factor *= 0.8;
        f = 0.8;
    }
    else
    {
        _factor *= 1.25;
        f = 1.25;
    }

    _label->resize(_factor * _label->pixmap()->size());

    scrollbarHor->setValue(int(f * scrollbarHor->value() + ((f - 1) * scrollbarHor->pageStep() / 2)));
    scrollbarVer->setValue(int(f * scrollbarVer->value() + ((f - 1) * scrollbarVer->pageStep() / 2)));

    e->accept();
}

1 个答案:

答案 0 :(得分:0)

我必须在MyWidget中定义一个事件过滤器:

bool MyWidget::eventFilter(QObject *o, QEvent *e)
{
    if (e->type() == QEvent::Wheel)
    {
        QWheelEvent* we = static_cast<QWheelEvent*>(e);

        if (o == _scrollArea->verticalScrollBar())
            wheelEvent(we);
        else
            return false;
    }
}

并在垂直滚动条上安装过滤器:

_scrollArea->verticalScrollBar()->installEventFilter(this);
相关问题