IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Souci d'affichage d'image

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut Souci d'affichage d'image
    Bonjour,

    Je code en C++ avec la librairie Qt pour les fenêtrages.
    Je débute totalement en POO, donc j'essaye de suivre, et surtout de comprendre ^^, les différents tutos que je trouve sur ce site ainsi que celui du Site des zéros.

    J'ai déjà réussi a faire le tutoriel Création d'une fenêtre personnalisée que j'ai un peu transformer pour en faire une fenêtre de bienvenue où la barre de titre est devenue une statusbar qui affiche les informations environnementales du logiciel.

    Mon soucis survient lorsque je veux intégrer une image (photo) dans un un widget.

    J'arrive à intégrer cette dernière directement dans le fichier Main.cpp, pas de soucis de ce côté la.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <QtGui>
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        QLabel label;
        //on donne l'image au label
        label.setPixmap(QPixmap("Test.jpg")); 
        label.show();
        QObject::connect(&label, SIGNAL(clicked()), &app, SLOT(quit()));
        return app.exec();
    }
    Là ou je coince, c'est que j'utilise un fichier Main qui vas appeler une classe (se trouvant dans un autre fichier). Et ce sera cette classe qui définira la fenêtre (paramétrage et style).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Organisation physique du projet :
     
    ~/Projet/
    ~/Projet/IHM/Headers/Zonage.h
    ~/Projet/IHM/Zonage/Zonage.cpp
    ~/Projet/Main.cpp
    Donc le fait d'inclure le code d'insertion de l'image dans le fichier Main.cpp n'est pas possible. Et je voudrai placer cette dernière dans le fichier de Zonage.cpp au niveau du constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    // Fichier Zonage.cpp
     
    #include <QtGui>
    #include "../Headers/Zonage.h"
     
    Zonage::Zonage()
    {
    // Barre de menu Gestion avec un sous menu Quitter :
    QMenu *menuGestion = menuBar() -> addMenu("&Gestion");
      QAction *actionQuitter = new QAction("&Quitter"), this);
      menuGestion->addAction(actionQuitter);
         actionQuitter ->setShortcut(QKeySequence("Ctrl+Q"));
         connect(actionQuitter,   SIGNAL(triggered()), qApp, SLOT(quit()));
     
    // Insertion photo :
    QLabel label;
    label.setPixmap(QPixmap("./Test.jpg"));
     
    }
    La photo se trouve dans le même dossier que Zonage.cpp d'où le chemin de la photo : "./Test.jpg"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Fichier Main.cpp
     
    #include <QApplication>
    #include "./IHM/Headers/Zonage.h"
     
    int main(int argc, char *argv[])
    {
      QApplication app(argc, argv);
      Zonage Obj_Zonage;
      Obj_Zonage.showMaximized();
      return app.exec();
    }
    Je vous ait fait grâce de l'header qui est très minimaliste.

    En procédant de cette manière, je n'arrive pas a afficher mon image, mais ma barre de menu, avec le raccourci, est déjà active.
    Je me doute bien, que c'est une erreur de grand débutant, mais je n'ai pas assez de bagages pour comprendre ce qui me bloque.

    Merci d'avance pour toutes les aides apportées et encore plus pour les explications.
    Merci à vous

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Citation Envoyé par totom7 Voir le message
    La photo se trouve dans le même dossier que Zonage.cpp d'où le chemin de la photo : "./Test.jpg"
    Ton image ne doit pas être référencée par rapport aux fichiers sources.

    label.setPixmap(QPixmap("./Test.jpg"));

    Indique que Qt doit, au lancement de l'application, charger le fichier "Test.jpg" qui se trouve dans le répertoire courant. Et le répertoire courant, ça peut être pas mal de choses: si tu démarres ton programme avec "/home/totom7> /opt/apps/myapp", le répertoire courant, c'est /home/totom7 ; et le répertoire courant peut changer grâce aux fonctions qui vont bien de QDir.

    De plus, faire ainsi va te forcer à fournir le .jpg avec ton application.

    Jette un oeil aux ressources : http://qt.developpez.com/doc/4.7/systeme-ressources-qt/ ; cela te permet d'indiquer à Qt d'intégrer ton image lors de la compilation à ton exécutable.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Citation Envoyé par totom7 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // Fichier Zonage.cpp
    
    #include <QtGui>
    #include "../Headers/Zonage.h"
    
    Zonage::Zonage()
    {
    // Barre de menu Gestion avec un sous menu Quitter :
    QMenu *menuGestion = menuBar() -> addMenu("&Gestion");
      QAction *actionQuitter = new QAction("&Quitter"), this);
      menuGestion->addAction(actionQuitter);
         actionQuitter ->setShortcut(QKeySequence("Ctrl+Q"));
         connect(actionQuitter,   SIGNAL(triggered()), qApp, SLOT(quit()));
    
    // Insertion photo :
    QLabel label;
    label.setPixmap(QPixmap("./Test.jpg"));
    
    }
    Tu as 2 soucis ici.
    Le premier est un problème C++.

    Ton code indique: "crée un label sur la pile, met lui une image". Et créer un objet sur la pile va lui conférer une durée de vie équivalente au scope. En clair, ton QLabel va être détruit à la prochaine parenthèse fermante.

    Dans le cas du main(), la parenthèse fermante est atteinte une fois app->exec() terminé, donc une fois l'application terminée ; mais dans ton cas, la parenthèse fermante est atteinte une fois l'image mise sur le QLabel, donc très rapidement.

    Il faut donc que tu utilises le tas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QLabel * label = new QLabel(this);
    Ainsi, le QLabel ne sera pas détruit à la fin de la fonction. Par contre, c'est à toi (en C++ classique) de veiller à détruire le QLabel quand tu n'en as plus besoin, sinon tu as des pertes de mémoire (memory leak).
    Heureusement, Qt se propose de t'aider: en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QLabel * label = new QLabel(this);
    Tu indiques que l'objet courant est parent du QLabel ; et que lorsque l'objet courant sera détruit, il doit détruire le QLabel.

    Je te conseille de regarder un peu la doc C++ sur l'allocation mémoire, et sur le système QObject de Qt.

    2e souci: Les QWidgets utilisent un système de Layout, en gros ils ont besoin de savoir comment disposer les widgets enfants (en grille, en colonne, en ligne, en formulaire...).
    En général, on fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    QxxxWidget * parent = new QxxxWidget();
    QxxxLayout * parentLayout = new QxxxLayout(parent);
     
    QyyyWidget * child = new QyyyWidget( parent );
    parentLayout->addWidget( child );
    Pour ton QLabel, il faut donc 1. lui donner le bon parent (et ça aide pour le problème de mémoire), 2. l'ajouter au layout du parent.

Discussions similaires

  1. Soucis d'affichage d'images
    Par Bourg dans le forum SDL
    Réponses: 1
    Dernier message: 13/01/2015, 20h12
  2. Souci d'affichage d'image dans un bouton.
    Par wolfdream dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/10/2010, 17h30
  3. souci d'affichage image dans les <li>
    Par {F-I} dans le forum Mise en page CSS
    Réponses: 20
    Dernier message: 25/11/2008, 11h59
  4. PB affichage d'image avec IE
    Par arturo dans le forum Modules
    Réponses: 6
    Dernier message: 25/09/2003, 17h28
  5. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo