Seite 1 von 1

Kontinuierliche Bildbetrachtung mit Qt Bsp. Image Viewer

Verfasst: 16. November 2010 12:18
von don_js
Hey!

Ich nutze den Image Viewer aus den Qt Examples um ein Bild zu öffnen und es darin etwas zu modifizieren: http://doc.qt.nokia.com/4.6/widgets-imageviewer.html

Stand der Dinge sind Einzelbilder, die einfach über "Bild öffnen" geladen werden.

Jetzt will ich das auf Sequenzen von Bildern ausweiten. D.h. ich öffne manuell ein Bild, und ich möchte über Qt dann das nächste Bild automatisch laden lassen. Die Bilder haben im Namen eine fortlaufende Nummer, und die Anforderung der Bilder ist auch kein Problem, das klappt.
(Das ganze wird von einem Server abgerufen und an meinen Clientrechner übertragen, die Bilder liegen auch am Client zum Öffnen vor - aber nur als Zusatzinfo, das ist nicht mein Problem).

Mein Problem ist jetzt, dass zwar eine Folge von Bildern übertragen wird, allerdings nur das letzte Bild angezeigt wird.
Ich möchte allerdings, dass jedes Bild kurz angezeigt wird, bevor dann das nächste vorliegt und wieder geöffnet wird.

Ich versuch jede Datei auch zu öffnen, über die bereits im Beispiel integrierte Open-Funktion:

Code: Alles auswählen

/* Oeffnet die als Parameter uebergebene Datei */
void ImageViewer::open(QString file)
{
    QString fileName = file;
    if (!fileName.isEmpty()) {
        QImage image(fileName);
        if (image.isNull()) {
            QMessageBox::information(this, tr("ROI Imageviewer"),
                                     tr("Cannot load %1.").arg(fileName));
            return;
        }
        imageLabel->setPixmap(QPixmap::fromImage(image));
        scaleFactor = 1.0;

        fitToWindowAct->setEnabled(true);
        updateActions();

        if (!fitToWindowAct->isChecked())
            imageLabel->adjustSize();
    }
}
Meine Vermutung ist jetzt, dass Qt das Bild erst anzeigt, wenn die Funktionen alle durchgelaufen sind, und dann erst ein Bild läd - eben das letzte aus meiner Bilderserie.

Lieg' ich da mit meiner Vermutung richtig, dass Qt das Bild im Image Viewer erst läd nachdem die Funktionen durch sind?
Und kennt jmd eine Option Bilder quasi als Diashow anzeigen zu lassen?
Evtl über neuzeichnen oder irgendwas?

Würde mich über Hilfe sehr freuen, hab' mich in Qt jetzt eingearbeitet, aber die Bild-Anwendungen sind mir da noch neu.

Schöne Grüße

Verfasst: 16. November 2010 13:11
von Amael
Hi,

ich hatte ein ähnliches Problem, da ich in meinem Dialog nach dem Auslösen einer Berechnungsfunktion einige Funktionalitäten des Dialogs abschalten wollte. Die Abschaltung hat er erst am Ende der Berechnungsfunktion gemacht.

Bin mir unsicher, ob es dir hilft und vlt. ist es eine umständliche Lösung, aber ich habe an der Stelle, an der ich eine Interaktion mit dem Dialog wollte (z.B. auch ein Report) eine QTimer eingebaut und ihn dort 10 MSec warten lassen, hatte danach prima funktioniert.

So sah das ganze aus:

Code: Alles auswählen

        QTime dieTime = QTime::currentTime().addMSecs(10);
        while( QTime::currentTime() < dieTime )
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);

Verfasst: 16. November 2010 13:59
von don_js
Hey,

super Sache, scheint's gewesen zu sein :-)

Ich hatte das Programm kurz schlafen lassen, bis die Dateien auch sicher da sind, aber das mochte Qt anscheinend nicht.

Bei mir ist auch das "Datei öffnen"-Fenster nie zugegangen, bis alle Bilder komplett angefragt wurden, aber jetzt sieht's sehr gut aus!

Besten Dank, hilft mir enorm weiter!

Schöne Grüße

Verfasst: 16. November 2010 14:28
von chrislo1976
Hallo!

Ich löse derart Probleme gern mit:

Code: Alles auswählen

QTimer::singleShot(100, this, SLOT(updateData()));
Damit hat die GUI Zeit sich aufzufrischen, bevor die zeitintensive Funktion aufgerufen wird und die GUI blockiert.

Gruß,
Christian