
Originally Posted by
wysota
You should really use QMdiArea or QGraphicsView as suggested, but if you insist on using the scroll area directly then this works for me:
#include <QScrollArea>
#include <QLabel>
#include <QApplication>
#include <QMouseEvent>
#include <QScrollBar>
public:
setWidget(l);
setWidgetResizable(true);
l->installEventFilter(this);
}
if(o!=l)
if(e
->type
()==QEvent::MouseButtonPress){ return true;
}
if(e
->type
()==QEvent::MouseMove){ m_prev = pt;
horizontalScrollBar()->setValue(horizontalScrollBar()->value()+diff.x());
verticalScrollBar()->setValue(verticalScrollBar()->value()+diff.y());
return true;
}
}
protected:
};
int main(int argc, char **argv){
ScrollArea sa(argv[1]);
sa.show();
return app.exec();
}
#include <QScrollArea>
#include <QLabel>
#include <QApplication>
#include <QMouseEvent>
#include <QScrollBar>
class ScrollArea : public QScrollArea {
public:
ScrollArea(const QString &path) : QScrollArea(0){
l = new QLabel(this);
setWidget(l);
setWidgetResizable(true);
l->setPixmap(QPixmap(path));
l->installEventFilter(this);
}
bool eventFilter(QObject *o, QEvent *e){
if(o!=l)
return QScrollArea::eventFilter(o,e);
if(e->type()==QEvent::MouseButtonPress){
m_prev = ((QMouseEvent*)e)->pos();
return true;
}
if(e->type()==QEvent::MouseMove){
QPoint pt = ((QMouseEvent*)e)->pos();
QPoint diff = pt-m_prev;
m_prev = pt;
horizontalScrollBar()->setValue(horizontalScrollBar()->value()+diff.x());
verticalScrollBar()->setValue(verticalScrollBar()->value()+diff.y());
return true;
}
return QScrollArea::eventFilter(o,e);
}
protected:
QLabel *l;
QPoint m_prev;
};
int main(int argc, char **argv){
QApplication app(argc, argv);
ScrollArea sa(argv[1]);
sa.show();
return app.exec();
}
To copy to clipboard, switch view to plain text mode
It makes something wrong when you drag it more than one pixel in one direction. Is accumulative. I got one solution for it:
#include <QScrollArea>
#include <QLabel>
#include <QApplication>
#include <QMouseEvent>
#include <QScrollBar>
#include<QDebug>
public:
{
this->n=3;
this->prev_diff.setX(0);
this->prev_diff.setY(0);
QImage imagen
("C:/donostia.jpg");
l
->setPixmap
(QPixmap::fromImage(imagen
));
setWidget(l);
setWidgetResizable(true);
//l->setPixmap(QPixmap(path));
l->installEventFilter(this);
}
{
if(o!=l)
if(e
->type
()==QEvent::MouseButtonPress) {
this->prev_diff.setX(0);
this->prev_diff.setY(0);
return true;
}
if(e
->type
()==QEvent::MouseMove) {
this->diff = pt-m_prev-prev_diff*n;
m_prev = pt;
horizontalScrollBar()->setValue(horizontalScrollBar()->value()+diff.x()*n);
verticalScrollBar()->setValue(verticalScrollBar()->value()+diff.y()*n);
qDebug
()<<
"("+QString::number(diff.
x())+","+QString::number(diff.
y())+")";
this->prev_diff=diff;
return true;
}
}
protected:
int n;
};
int main(int argc, char **argv)
{
ScrollArea sa;
sa.show();
return app.exec();
}
#include <QScrollArea>
#include <QLabel>
#include <QApplication>
#include <QMouseEvent>
#include <QScrollBar>
#include<QDebug>
class ScrollArea : public QScrollArea {
public:
ScrollArea() : QScrollArea()
{
this->n=3;
this->prev_diff.setX(0);
this->prev_diff.setY(0);
l = new QLabel(this);
QImage imagen("C:/donostia.jpg");
l->setPixmap(QPixmap::fromImage(imagen));
setWidget(l);
setWidgetResizable(true);
//l->setPixmap(QPixmap(path));
l->installEventFilter(this);
}
bool eventFilter(QObject *o, QEvent *e)
{
if(o!=l)
return QScrollArea::eventFilter(o,e);
if(e->type()==QEvent::MouseButtonPress)
{
m_prev = ((QMouseEvent*)e)->pos();
this->prev_diff.setX(0);
this->prev_diff.setY(0);
return true;
}
if(e->type()==QEvent::MouseMove)
{
QPoint pt = ((QMouseEvent*)e)->pos();
this->diff = pt-m_prev-prev_diff*n;
m_prev = pt;
horizontalScrollBar()->setValue(horizontalScrollBar()->value()+diff.x()*n);
verticalScrollBar()->setValue(verticalScrollBar()->value()+diff.y()*n);
qDebug()<<"("+QString::number(diff.x())+","+QString::number(diff.y())+")";
this->prev_diff=diff;
return true;
}
return QScrollArea::eventFilter(o,e);
}
protected:
QLabel *l;
QPoint m_prev;
QPoint diff;
QPoint prev_diff;
int n;
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
ScrollArea sa;
sa.show();
return app.exec();
}
To copy to clipboard, switch view to plain text mode
Bookmarks