Seite 1 von 1

2. Fenster läd Image nicht

Verfasst: 5. Januar 2012 12:41
von JohnR
Hi

John hat mal wieder ne geistige Blockade......

Ich öffne in meiner Hauptanwendung ein 2. Fenster, abgeleitet von QDialog, dieses habe ich auf ein Kontextmenü innerhalb eines QlistWidgets connected, das Funktioniert alles wunderbar.

Das laden eines Images in ein QLabel wil mir aber einfach nicht gelingen.

hier der Code der betreffenden Funktion

Code: Alles auswählen

void PictureViewer::createwindow(QStringList globallist,int i)
{

    fileName = globallist[i];
    image.load(fileName);
    if (image.isNull())
    {
      QMessageBox::information(this, tr("Image Viewer"),
      tr("Cannot load %1.").arg(fileName));
      qDebug() << "image wont load";
    }
    pictureview.label_2->setPixmap(QPixmap::fromImage(image));
    pictureview.label->setText("test");



    qDebug() << image.depth() ;

    PictureViewer p;
    p.exec();
und die .h

Code: Alles auswählen

#ifndef PICTUREVIEWER_H
#define PICTUREVIEWER_H

#include <QDialog>
#include "ui_Pictureviewer.h"


class PictureViewer : public QDialog
{
    Q_OBJECT
public:
    explicit PictureViewer(QWidget *parent = 0);
    QImage image;
private:
    Ui::Pictureviewer pictureview;
    QString fileName;
    QStringList globallist;
    int i;
    void close();
signals:
    
public slots:
    void createwindow(QStringList globallist, int i);
    void picture();
    
    
};

#endif // PICTUREVIEWER_H

Globallist ist eine QStringlist die die Dateipfade vorhält, die int ist die row der Qlistview.

Das Bild wird auch definitiv geladen, qDebug() << image.depth() ; gibt mir 32 aus......


Wenn ich meinen Fehler mal selbst versuchen darf einzugrenzen

es liegt doch bestimmt an der Erzeugung des Fensters via .exec() bzw. an dessen "Zeitpunkt" im Ablauf das die Sache nicht will.

Kann durchaus sein das ich hier wieder eine elementare Sache nicht begriffen habe, also franzf und christian Biiiittttteeee nicht an mir verzweifeln :D

Re: 2. Fenster läd Image nicht

Verfasst: 5. Januar 2012 13:27
von brax
In Deiner createwindow Methode erzeugst Du am Ende einen neuen PicureViewer (p) und führt diesen dann über exec() aus. Dieser neue PictureViewer hat natürlich nicht das Label gesetzt, das Du vorher an der Membervariable "pictureview" von "this" gesetzt hat.

Ich bin mir nicht 100% sicher, ob man innerhalb einer Methode von einem QDialog diesen dann über exec() ausführen kann (wobei ich nicht direkt wüßte, warum nicht), aber versuch doch einfach mal am Ende der createwindow Methode das hier:

Code: Alles auswählen

PictureViewer p;
p.exec();
durch das hier:

Code: Alles auswählen

exec();
zu ersetzen.

Schöner fände ich allerdings den Code vom Initialisieren des PictureViewers vom exec() zu trennen.

Re: 2. Fenster läd Image nicht

Verfasst: 5. Januar 2012 13:31
von Christian81
Stimmt der Pfad denn auch (Debugausgabe!) bzw. ist er evtl. relativ angegeben?

Re: 2. Fenster läd Image nicht

Verfasst: 5. Januar 2012 15:54
von JohnR
Der Pfad ist o.k. , also c:/test/blume.jpg bspw. das Bild wird ja auch geladen und ich kann per debug auch die Farbtiefe bspw. ausgeben.

was mir nicht in den Kopf will ist wenn ich pictureview.label->setText("test"); angebe, siehe cpp oben wird dies auch nicht ausgeführt O.o

es liegt demzufolge also weniger an dem image sondern ist ein generelles Problem was ich mit meinen begrenzten Wissen halt auf die p.exec(); schieben würde (soll nicht heißen es wäre ein bug sondern eher das ich hier irgendwas nicht gerafft bzw. falsch mache)....

das mit dem exec(); probier ich nachher mal aus, habe atm keine Möglichkeit es zu testen

Re: 2. Fenster läd Image nicht

Verfasst: 5. Januar 2012 16:37
von JohnR
wenn ich nur exec(); schreibe geht es einwandfrei :D

das trennen des execs vom code mache ich noch, war auch ursprünglich in 2 seperaten Funktionen, aber bei der ganzen testerei hatte ich es in eine Funktion geschmissen

Danke Brax

Re: 2. Fenster läd Image nicht

Verfasst: 5. Januar 2012 16:55
von brax
Schön, dass es funktioniert.

Nur nochmal als Erklärung, damit Dir sowas in der Art nicht nochmal passiert:
JohnR hat geschrieben: was mir nicht in den Kopf will ist wenn ich pictureview.label->setText("test"); angebe, siehe cpp oben wird dies auch nicht ausgeführt O.o
Das liegt daran, dass Du mit zwei PictureViewer Objekten arbeitest. Einmal das, das Du in den ersten 11 Zeilen der Methode benutzt und "befüllst" (nennen wir es einfach mal "this") und dann ist da noch dieses zweite Objekt mit dem unscheinbaren Namen "p". Und dieses ist dann das Objekt was angezeit wurde, denn genau auf diesem Objekt hast Du bisher das exec() aufgerufen. Dass aber "p" nichts von dem QPixmap weiß, das Du dem label_2 von "this->pictureview" gesetzt hast ist leider so, denn "p" hat sein ganz eigenes pictureview und damit auch sein ganz eigenes label_2.

Re: 2. Fenster läd Image nicht

Verfasst: 5. Januar 2012 17:07
von JohnR
aaaah ja das macht Sinn, ist aber für einen Neuling recht schwer zu erkennen

Danke Dir vielmals!


John