Image de fond dans un QMdiArea

Publié le par inazo

Alors pourquoi un article sur ça me direz vous ??? Simple j'ai passé des plombes a trouver un espèces de bout de code sur la toile pour arriver à mettre une image de fond sur mon QMdiArea de Qt sans que cette dernière ne se répéte ni ne s'étire... en gros pour arriver au résultat final :

 

Capture-1.jpg

Alors dans un premier temps il va falloire coder une class pour "surcharger" (désolé mais mon vocabulaire de dev objet est rouillé) la class d'origine de Qt QMdiArea, de manière super originale je l'ai nommé InazoMdiArea.h

 

La voici :

 

#ifndef INAZOMDIAREA_H
#define INAZOMDIAREA_H
#include <QtGui>


class inazoMdiArea : public QMdiArea
{
        Q_OBJECT
public:
        inazoMdiArea(QWidget *parent = 0): QMdiArea(parent)
        {

                /* On va aller charger l'image dès la création du MDI */
                i = QImage("/home/inazo/Bureau/workspace/Qt/ToolsBox/Mon.png");
        }
protected:
        /* J'ai placé l'image sur l'évènement de redimensionnement pour que mon Mon soit toujours centré.*/
        void resizeEvent(QResizeEvent *resizeEvent)
        {

                QImage newBackground(resizeEvent->size(), QImage::Format_RGB32);
                QPainter p(&newBackground);

                p.fillRect(newBackground.rect(), QColor("#5c5c5c")/*Qt::gray*/);
                               /* On recherche le ratio de la fenetre pour etre capable de positionner le Mon toujours au centre de la MDI */
                QImage scaled = i.scaled(i.size(),Qt::KeepAspectRatio);
                QRect scaledRect = scaled.rect();

                scaledRect.moveCenter(newBackground.rect().center());
                p.drawImage(scaledRect, scaled);
                setBackground(newBackground);

                QMdiArea::resizeEvent(resizeEvent);
        }
private:
        QImage i;
};

#endif // INAZOMDIAREA_H

 

 

Donc on voie ici que j'ai utilisé le constructeur pour déclarer mon QImage et le stocké dans une variable "i" que je vais pouvoir utiliser partout dans mon QMdiArea. Ensuite la difficulité et que lorsque l'on va redimensionné l'image pour avoir un truc un poil bien chiallé et de faire en sorte que l'image de fond reste toujours centré.

 

Et donc en me promenant sur la toile voici que je tombe sur une solution posté dans le fin fond du net, une personne qui explique que pour cela il faudrait utiliser "resizeEvent" et il explique comment. Donc c'est ce que j'ai refait dans mon code le tout en changeant la couleur de fond, pour être plus dans mon esprit et voilà le tour et joué !

 

Pas la peine de faire de fichier en .cpp pour cette class, une fois fait il suffit de recoder l'appel au MDI comme ceci :

 

#include "toolsbox.h"

#include <QTextEdit>
#include "inazoMdiArea.h"
#include "crypto.h"
#include <QMenu>


ToolsBox::ToolsBox()
{
    this->zoneCentrale = new inazoMdiArea(this);

    //-- On commence le menu Ici le menu de Crypto
        QMenu *CryptoM = menuBar()->addMenu("&Crypto");

        QAction *convertion = new QAction("Convertion", this);
        CryptoM->addAction(convertion);

        connect(convertion, SIGNAL(triggered()), this,SLOT(ShowConvert()));
    //-- Fin du menu Crypto

    setCentralWidget(this->zoneCentrale);
}

//----------------------------------------
//          DEBUT DES SLOTS
//----------------------------------------

//-- Appel du plugin de convertion des chaines
void ToolsBox::ShowConvert(){

    Crypto *C = new Crypto();
    C->ShowConvert(this);
}

Voila avec ceci pas de soucis d'image qui ce répète dans tous les sens etc, si jamais j'ai pas été assé clair dans le code hésitez pas à demander :)

 

@+

Publié dans Programmation

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article