class ImageViewDialog : public QDialog{ Q_OBJECT // Member Variablesprivate: double scaleFactor; QLabel* imageLabel; QScrollArea* scrollArea; QPushButton* buttonZoomIn; QPushButton* buttonZoomOut; // Constructor & Destructorpublic: ImageViewDialog(const QString& image, QWidget* parent=0); // Member Functionsprivate: void scaleImage(double factor); void adjustScrollBar(QScrollBar* scrollBar, double factor);private slots: void slotZoomIn(); void slotNormalSize(); void slotZoomOut();};
ImageViewDialog::ImageViewDialog(const QString& fileName, QWidget* parent) : QDialog(parent){ setWindowFlags(windowFlags()|Qt::WindowMaximizeButtonHint); QImage image(fileName); if(image.isNull()){ QMessageBox::information(this, tr("Show image"), tr("Cannot load %1.").arg(fileName)); } imageLabel=new QLabel; imageLabel->setBackgroundRole(QPalette::Base); imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); imageLabel->setScaledContents(true); imageLabel->setPixmap(QPixmap::fromImage(image)); scaleFactor=1.0; scrollArea=new QScrollArea; scrollArea->setBackgroundRole(QPalette::Dark); scrollArea->setWidget(imageLabel); buttonZoomIn=new QPushButton(tr("Zoom &In")); QPushButton* buttonNormalSize=new QPushButton(tr("&Normal Size")); buttonZoomOut=new QPushButton(tr("Zoom &Out")); QPushButton* buttonClose=new QPushButton(tr("&Close")); connect(buttonZoomIn, SIGNAL(clicked()), SLOT(slotZoomIn())); connect(buttonNormalSize, SIGNAL(clicked()), SLOT(slotNormalSize())); connect(buttonZoomOut, SIGNAL(clicked()), SLOT(slotZoomOut())); connect(buttonClose, SIGNAL(clicked()), SLOT(accept())); QHBoxLayout* buttonLayout=new QHBoxLayout; buttonLayout->setMargin(5); buttonLayout->addStretch(1); buttonLayout->addWidget(buttonZoomIn); buttonLayout->addWidget(buttonNormalSize); buttonLayout->addWidget(buttonZoomOut); buttonLayout->addStretch(1); buttonLayout->addWidget(buttonClose); QVBoxLayout* layout=new QVBoxLayout; layout->setSpacing(5); layout->setMargin(5); layout->addWidget(scrollArea); layout->addLayout(buttonLayout); setLayout(layout);}void ImageViewDialog::scaleImage(double factor){ scaleFactor*=factor; imageLabel->resize(scaleFactor * imageLabel->pixmap()->size()); adjustScrollBar(scrollArea->horizontalScrollBar(), factor); adjustScrollBar(scrollArea->verticalScrollBar(), factor); buttonZoomIn->setEnabled(scaleFactor < 3.0); buttonZoomOut->setEnabled(scaleFactor > 0.333);}void ImageViewDialog::adjustScrollBar(QScrollBar* scrollBar, double factor){ scrollBar->setValue(int(factor * scrollBar->value() + ((factor - 1) * scrollBar->pageStep()/2)));}void ImageViewDialog::slotZoomIn(){ scaleImage(1.25);}void ImageViewDialog::slotNormalSize(){ imageLabel->adjustSize(); scaleFactor=1.0; buttonZoomIn->setEnabled(true); buttonZoomOut->setEnabled(true);}void ImageViewDialog::slotZoomOut(){ scaleImage(0.8);}
scrollArea->resize(imageLabel->size());
QSize size=imageLabel->size(); size.rheight()+=2*QApplication::style()->pixelMetric(QStyle::PM_DefaultFrameWidth); size.rwidth()+=2*QApplication::style()->pixelMetric(QStyle::PM_DefaultFrameWidth); scrollArea->setMinimumSize(size);