QGraphicsView zum Zoomen verwenden

Alles rund um die Programmierung mit Qt
Antworten
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

QGraphicsView zum Zoomen verwenden

Beitrag von sven-kt »

Hallo,

ich habe ein Programm mit dem ich .gif Bilder betrachte und zoome.

Das Ganze habe ich mit einem QGraphicsView und einer QGraphicsScene realisiert.
Die Bilder werden über QGraphicsPixmapItems mit setPixmap und addItem zur Scene hinzugefügt.
Das Zoomen erledige ich mit QTransform und scale. Das klappt soweit ganz gut, doch ich habe einzelne .gif Bilder,
die die Anwendung beim Zoom auf den Faktor 0.5 (und da auch erst beim 2. Mal) crashen lassen.
Das passiert allerdings auch nur unter Windows Vista, unter Windows XP und Kubuntu zoomen alle .gif einwandfrei.

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QGraphicsScene *myScene = new QGraphicsScene;
    QGraphicsPixmapItem *myItem = new QGraphicsPixmapItem;
    myItem->setPixmap(QPixmap(":/image.gif"));
    myScene->addItem(myItem);
    ui->graphicsView->setScene(myScene);
}

void MainWindow::on_doubleSpinBox_valueChanged(double )
{
    QTransform transform;
    ui->graphicsView->setTransform(transform.scale(ui->doubleSpinBox->value(),ui->doubleSpinBox->value()));
}
Der Debugger bleibt in qblendfunctions.cpp auf Zeile 682 stehen:

Code: Alles auswählen

678		while (h--) {
679			const uint *src = (const quint32 *) (srcPixels + (srcy >> 16) * sbpl);
680			int srcx = basex;
681			for (int x=0; x<w; ++x) {
682        	   blender.write(&dst[x], src[srcx >> 16]);
683				srcx += ix;
684			}
Gibt es eine bessere und sichere Möglichkeit um Bilder zu zoomen,
oder wie kann ich verhindern, dass mir die Anwendung abstürzt?

mfg
sven
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

Beitrag von sven-kt »

Hi,

ich habe jetzt jetzt zwischenzeitlich mal:

Code: Alles auswählen

graphicsView->setViewport(new QGLWidget);
versucht. Da läuft das ganze unter Vista, jedoch nicht mehr unter XP, da ich hier nur eine SIS Mirage 3 Grafikkarte habe, die OpenGL nicht soweit unterstützt.

Dann hab ich es noch versucht mit:

Code: Alles auswählen

graphicsView->scale(factor, factor)
zu zoomen, und das hat auch funktioniert. Leider lässt sich hier das Vergrössern/Verkleinern nicht sonderlich gut mit einer doubleSpinBox realisieren.

edit: hat nur funktioniert, da ich den Wert 0.50(böser wert) da nie genau getroffen habe


Und da scale() ja ebenfalls mit einer QTransform arbeitet, hier doch nochmal die Frage ob ich nicht evtl. etwas besser machen kann, etwas übersehen habe, so dass ich das erste Beispiel verwenden kann?


viele Grüße

sven
Zuletzt geändert von sven-kt am 7. Juli 2009 14:32, insgesamt 1-mal geändert.
Qt 4.5, Windows Vista, Kubuntu
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Da dies möglicherweise ein 'minimal, funktionierbares Beispiel' zur Verfügung stellen,
oder mal in den Task-Tracker schaun, ob da was steht,
oder dies in den Task-Tracker eintragen.
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

Beitrag von sven-kt »

Ok, danke.
Habe da nichts dergleichen gefunden und da ich denen mein(e) .gif
nicht schicken kann, werde ich es erstmal nicht eintragen.

Naja, immerhin funktionierts, wenn man die QPixmap scaled, allerdings sehr langsam.


thx

sven
Qt 4.5, Windows Vista, Kubuntu
rage
Beiträge: 11
Registriert: 24. Juli 2007 18:40
Wohnort: Berlin
Kontaktdaten:

Beitrag von rage »

Ich habe das selbe Problem beobachtet. Unter Windows stürzt meine Anwendung auch beim Skalieren mit dem Faktor 0.5 ab. Anstatt 0.5 habe ich einfach mal 0.5001 probiert und hatte Glück... Der Unterschied fällt nicht weiter auf und es läuft nun auch unter Windows.

Code: Alles auswählen

painter.scale(0.5001, 0.5001);
Antworten