00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <ImageScrollArea.h>
00022
00035 ImageScrollArea::ImageScrollArea(QWidget *parent):
00036 QScrollArea(parent),
00037 imageLabel(new QLabel),
00038 scaleFactor(1.0)
00039 {
00040 setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
00041
00042 imageLabel->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
00043 imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
00044 imageLabel->setScaledContents(true);
00045
00046 setWidget(imageLabel);
00047 scaleImage(1.0);
00048 }
00049
00053 QLabel* ImageScrollArea::image()
00054 {
00055 return imageLabel;
00056 }
00057
00061 void ImageScrollArea::wheelEvent(QWheelEvent *event)
00062 {
00063 int numDegrees = event->delta() / 8;
00064 int numSteps = numDegrees / 15;
00065
00066 if (event->modifiers() & Qt::ShiftModifier)
00067 horizontalScrollBar()->setValue(horizontalScrollBar()->value() - 3*numSteps*horizontalScrollBar()->singleStep());
00068 else if (event->modifiers() & Qt::ControlModifier)
00069 scaleImage(1.0+(double(numSteps)/10.0));
00070 else
00071 verticalScrollBar()->setValue(verticalScrollBar()->value() - 3*numSteps*verticalScrollBar()->singleStep());
00072
00073 event->accept();
00074 }
00075
00082 void ImageScrollArea::scaleImage(double factor, bool relative)
00083 {
00084 if(imageLabel->pixmap())
00085 {
00086 if (relative)
00087 scaleFactor *= factor;
00088 else
00089 scaleFactor = factor;
00090 imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());
00091
00092 adjustScrollBar(horizontalScrollBar(), factor, relative);
00093 adjustScrollBar(verticalScrollBar(), factor, relative);
00094
00095 emit scaleChanged(scaleFactor);
00096 }
00097 }
00098
00099
00103 void ImageScrollArea::adjustScrollBar(QScrollBar *scrollBar, double factor, bool relative)
00104 {
00105 if (relative)
00106 scrollBar->setValue(int(factor * scrollBar->value()
00107 + ((factor - 1) * scrollBar->pageStep()/2)));
00108 else
00109 scrollBar->setValue((scrollBar->maximum() - scrollBar->minimum())/2);
00110
00111 }
00112