Я сделал прокручиваемый просмотрщик изображений на основе этого пример.
Я использую 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();
}
Мне пришлось определить фильтр событий в 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);
Других решений пока нет …