ich muss einen Zoom für ein in einem QLabel anzuzeigendes jpeg-Bild implementieren und hab mich da an das imageviewer-Bsp aus dem examples-Verzeichnis von Qt gehalten.
Zunächst leite ich mein in einer QScrollArea anzuzeigendes Bild von QLabel ab:
Code: Alles auswählen
class QPicture : public QLabel
{
Q_OBJECT
public:
QPicture(QWidget *parent = 0);
QPicture(const QString& filename, QWidget *parent = 0);
[...]
};
Code: Alles auswählen
QPicture::QPicture(QWidget *parent)
: QLabel(parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
// QLabel init
setBackgroundRole(QPalette::Base);
setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
setScaledContents(true);
}
Code: Alles auswählen
bool QPicture::load(const QString& filename)
{
if (!filename.isEmpty()) {
QImage image(filename);
if (image.isNull()) {
qWarning("Cannot load '%s'", qPrintable(filename));
return false;
}
setPixmap(QPixmap::fromImage(image));
mScaleFactor = 1.0;
adjustSize();
update();
return true;
}
Code: Alles auswählen
void QPicture::paintEvent(QPaintEvent* e)
{
QLabel::paintEvent(e);
QPainter p(this);
refreshPixmap(&p); // draw path
}
Code: Alles auswählen
void QPicture::scaleImage(double factor)
{
if (!this->pixmap()) {
qDebug() << "No Pixmap loaded!";
return;
}
resize(factor * this->pixmap()->size());
}
Code: Alles auswählen
MainWindow::MainWindow()
: pic(0), scrollArea(0)
{
scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
pic = new QPicture(scrollArea);
scrollArea->setWidget(pic);
setCentralWidget(scrollArea);
resize(800,600);
}
Gibt es irgendwelche Tricks beim Laden/Skalieren von jpeg-Bildern? Die Methode mit setPixmap() und resize() scheint auf jeden Fall nicht praktikabel zu sein für größere Bilder...
Danke für alle Hinweise,
AlGaN
P.S.: Die Klasse QPicture hat nichts mit der gleichnamigen Klasse von Qt zu tun, ich hab die Klasse nur zum besseren Verständnis umbenannt...