Полоса прокрутки фиксирует событие колеса по фокусу?

Я сделал прокручиваемый просмотрщик изображений на основе этого пример.
Я использую QLabel, QImage и QScrollArea.

Я хотел бы увеличивать и уменьшать масштаб с помощью QWheelEvent.

Моя проблема в том, что событие генерируется, только если полоса прокрутки находится сверху или снизу, в противном случае она просто прокручивает изображение.

Есть идеи?

.час

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]