Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Afficher une image de fond

dans une QMainWindow

Sujet résolu
Anonyme
    17 juin 2007 à 11:20:45

    Bonjour à tous

    J'ai un soucis pour afficher une image de fond avec Qt.

    J'ai une fenêtre qui doit afficher une image. Cette fenêtre a les mêmes dimensions que l'image de fond.

    Je me suis lancé dans la DOC officielle, mais le problème c'est qu'il y a tellement de class et de fonctions que je m'y perds...

    Quelqu'un connait-il un bon tuto qui aborde ce sujet?

    J'ai trouver quand même quelque petit truque dans la doc :


    /*******************************************************************************
            PRE-PROCESSOR
    *******************************************************************************/

    #include <QApplication>
    #include <QtGui>



    /*******************************************************************************
            CLASS DEFINITION
    *******************************************************************************/

    class MainWindow : public QMainWindow
    {
        public:
            MainWindow(std::string path);

        private:
            QLabel* imageLabel;
    };



    /*******************************************************************************
            METHOD DEFINITION
    *******************************************************************************/

    // Class MainWindow :
    MainWindow::MainWindow(std::string path)
    {
        imageLabel = new QLabel;
        QImage image(path.c_str());
        if (image.isNull())
        {
            QMessageBox::information(this, "Wigaab", "Cannot load background");
            return;
        }
        imageLabel->setPixmap(QPixmap::fromImage(image));

        imageLabel->show();
    }



    /*******************************************************************************
            MAIN
    *******************************************************************************/

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);

        MainWindow MyWindow("logo.bmp");

        MyWindow.show();

        return app.exec();
    }

    Mais ça m'ouvre une deuxième fenêtre et c'est pas ce que je veut...

    Comment puis-je y remédier?

    Sinon j'étais partis sur une autre voix :


    /*******************************************************************************
            CLASS DEFINITION
    *******************************************************************************/

    class MainWindow : public QMainWindow
    {
        public:
            MainWindow(std::string path);

        private:
            QImage c_mainBackground;
    };



    /*******************************************************************************
            METHOD DEFINITION
    *******************************************************************************/

    // Class MainWindow :
    MainWindow::MainWindow(std::string path)
    {
        c_mainBackground = QImage::QImage(path.c_str());
        c_mainBackground.show();
    }

    Le main() est le même pour ce deuxième code)

    Mais ça ne marche pas. Il n'existe pas de fonction QImage::show()...Et je ne trouve pas comment afficher l'image sinon.


    De ces deux "cas", lequel me conseillez vous de suivre?
    Ou s'il existe une autre méthode plus simple?

    Merci!
    Hiura
    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2007 à 12:11:53

      Si c'est juste pour afficher une image de fond. utilise un label, et appel la methode setPixmap dessus. Bref regarde ici : http://doc.trolltech.com/4.2/widgets-imageviewer-imageviewer-cpp.html
      la methode open().
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 juin 2007 à 12:14:58

        Je me suis justement inspirer de cette exemple pour mon premier code. Mais ça m'ouvre une deuxième fenêtre dont je ne veut pas.
        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2007 à 12:41:56

          ah ok désolé, bon bah pour pas ouvrir dde deuxième fenetre supprime cette ligne :

          imageLabel->show();


          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            17 juin 2007 à 12:51:40

            oui mais si je fais ça, mon fond ne s'affiche toujours pas...

            Une question me viens : Est-ce que les Label ouvre toujours une nouvelle fenêtre? Si c'est le cas, ne devrais-je pas utiliser quelque chose d'autre pour contenir mon image? Et si c'est encore le cas, que dois-je utiliser?

            A bientôt
            Hiura
            • Partager sur Facebook
            • Partager sur Twitter
              17 juin 2007 à 15:46:02

              C'est normal que ça ne te l'affiche pas si tu enleve la ligne que je t'ai indiqué, ton label n'a aucune attache à ta fenêtre.
              Regarde un peu le constructeur ImageViewer() , y'a même pas à chercher c'est indiqué dedans comment tu dois faire.
              Puis si tu veux mettre plusieurs images en fond, donc plusieurs labels tu n'a qu'à utiliser les layouts.
              • Partager sur Facebook
              • Partager sur Twitter
                17 juin 2007 à 16:42:08

                ce code devrait marcher :
                /*******************************************************************************
                        PRE-PROCESSOR
                *******************************************************************************/

                #include <QApplication>
                #include <QtGui>
                // pour les classes comme QString
                #include <QtCore>


                /*******************************************************************************
                        CLASS DEFINITION
                *******************************************************************************/

                class MainWindow : public QMainWindow
                {
                    public:
                        MainWindow(QString path);

                    private:
                        QLabel* imageLabel;
                };



                /*******************************************************************************
                        METHOD DEFINITION
                *******************************************************************************/

                // Class MainWindow :
                MainWindow::MainWindow(QString path) // QStrin et non std::string
                {
                    imageLabel = new QLabel (this); // rajout de "this"
                    QImage image(path);
                    if (image.isNull())
                    {
                        QMessageBox::information(this, "Wigaab", "Cannot load background");
                        return;
                    }
                    imageLabel->setPixmap(QPixmap::fromImage(image));
                   
                    setCentralWidget(imageLabel); // l'image devient le widget central de MainWindow
                    //imageLabel->show(); on supprime cette ligne car appelé automatiquement vu que imageLabel est un enfant de MainWindow
                }



                /*******************************************************************************
                        MAIN
                *******************************************************************************/

                int main(int argc, char *argv[])
                {
                    QApplication app(argc, argv);

                    MainWindow MyWindow("logo.bmp");

                    MyWindow.show();

                    return app.exec();
                }
                • Partager sur Facebook
                • Partager sur Twitter
                  17 juin 2007 à 16:57:43

                  Lui donner la reponse c'est pas trop l'aider...
                  En cherchant il aurait trouver comment faire et en plus en aurait appris plus.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 juin 2007 à 16:59:44

                    Il y a des erreurs de raisonnement dans ton programme(l'auteur du topic).
                    Tu dois toujours attacher un élément de fenêtre à la fenêtre justement à laquelle il appartient, celle dans laquelle il sera affiché. Toujours.
                    De plus, pour que l'image soit le fond de ta fenêtre, il faut que ton QLabel couvre toute la fenêtre en taille ... Sans ces choses là, ça ne risquait pas de marcher. Le show() mis à disposition par QT vient du fait que tous les composants héritent d'une classe QWidget ou quelque chose du genre, qui permet d'afficher des composants comme s'ils étaient des fenêtres. Cependant, lorsque tu veux tout simplement ajouter un élément dans une fenêtre, construire cet élément en lui donnant comme parent(=1er argument du constructeur dans les classes de Qt) this(pointeur sur l'instance de ta fenêtre) suffit.

                    Cependant, il y a coup sur comme dit ci dessus des solutions plus simples pour mettre une image à fond.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2007 à 17:31:47

                      Par contre, si tu inclue QtGui pas la peine d'inclure QApplication ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        17 juin 2007 à 18:23:00

                        Bonjour

                        @minirop :
                        Merci pour ce code, mais comme dit par certain autre, ça ne m'aide que trop peu : il n'y a pas vraiment d'explication... (et non parce que c'est un code que tu me donne; j'apprends bien avec les exemple bien commentés.)

                        imageLabel = new QLabel (this);


                        Pourquoi ce changement?

                        setCentralWidget(imageLabel);


                        Y a t il d'autre conséquence pour le programme que simplement l'affichage du fond?

                        @Alp :
                        ça ne fait que deux jours que j'ai commencé, alors j'ai besoin de toutes les infos possible pour bien coder mon application : Explique toi un peu plus et donne moi des exemples STP. (en gros j'ai rien compris a ton post, sauf que je dois le comprendre pour avancer :-° )

                        @Dark-Side : ok donc je ne mets que les deux include suivants, merci

                        Je vous remercie déjà pour votre aide, mais apparement j'ai pas du tout les connaissance qu'il me faut. Merci de m'aider :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 juin 2007 à 18:29:13

                          si tu dérives ta classe de QMainWindow faut utiliser "setCentralWidget" pour mettre le widget donné en paramètre utilisant toute la place du QMainWindow, sinon (QDialog ou QWidget) faut utiliser "setLayout" avec un dérivé de QLayout
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 juin 2007 à 18:34:21

                            MainWindow::MainWindow(std::string path)
                            {
                                imageLabel = new QLabel;
                                QImage image(path.c_str());
                                if (image.isNull())
                                {
                                    QMessageBox::information(this, "Wigaab", "Cannot load background");
                                    return;
                                }
                                imageLabel->setPixmap(QPixmap::fromImage(image));

                                imageLabel->show();
                            }

                            Lorsque tu construis imageLabel, une chose essentielle à comprendre est la suivante : tout élément que tu veux afficher dans ta fenêtre est réellement lié à ta fenêtre. Il faut lui dire "tu appartiens à telle fenêtre". La façon qu'on a de faire cela dans Qt, c'est
                            imageLabel = new QLabel(this);

                            this est ici un pointeur sur ta fenêtre. C'est une façon d'indiquer à ton label à qui il appartient. Il faut voir cela comme une hiérarchie.
                            Tu as ta fenêtre, à l'intérieur de laquelle tu as ton label, à l'intérieur duquel tu as une image.
                            Autre faute : tu dois faire en sorte que ton label prenne toute la taille de la fenêtre, donc le redimensionner serait plutôt pas mal.

                            Cependant, dans une bibliothèque comme Qt, tu as bon nombre d'outils pour réaliser je pense plus ou moins ce que tu veux dans la conception d'interface graphique. Donc n'hésite surtout pas à te casser la tête avec la doc, elle est riche à un point que l'on ne peut même pas imaginer.

                            Autre chose : consulte les exemples donnés avec Qt car ils sont eux aussi d'une utilité inestimable lorsque l'on apprend, et même après! Il y a par exemple un visionneur d'images, ...

                            Je pense que c'est déjà un bon début.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 juin 2007 à 18:38:16

                              Citation : Alp

                              tout élément que tu veux afficher dans ta fenêtre est réellement lié à ta fenêtre.
                              [...]
                              Il faut voir cela comme une hiérarchie.


                              comme çà lors de la destruction de ton MainWindow, tous ses enfants sont automatiquement supprimés et aussi lors de l'appel à "show()" ou du repaignage de la fenêtre les fonctions des enfants sont elles aussi appelés.

                              Citation : Alp

                              Autre faute : tu dois faire en sorte que ton label prenne toute la taille de la fenêtre, donc le redimensionner serait plutôt pas mal.


                              non car par défaut, le widget prend tout la place possible. (géré avec SizePolicy)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 juin 2007 à 18:47:41

                                Ah oui, c'est vrai.
                                Je n'y ai plus touché depuis un moment.

                                Pardon alors.

                                L'idée en disant à un objet qu'il est un "enfant" d'une fenêtre, c'est que c'est la fenêtre qui va le gérer, en effet.

                                C'est souvent comme ça lorsque l'on développe des applications. On délègue les gestion d'objets à d'autres objets, que l'on manipule => cela permet de ne pas se soucier dans le code "principal" de la gestion de sous-objets, et de se concentrer sur les objets "importants", au sens de la responsabilité.

                                Il y a bien d'autres raisons justifiant ce choix. En appliquant une telle politique, il est facile de maintenir son code si l'on chamboule toute une partie du code, par exemple.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  17 juin 2007 à 20:04:33

                                  Merci beaucoup pour tous ces éclaircissement! :)

                                  Je vous solliciterai bientôt pour une sorte de correction pour être sur d'avoir compris le principe.

                                  A bientôt
                                  Hiura
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  [Qt] Afficher une image de fond

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown