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

Qt Discussion :

Référence d'objet pour l'affichage d'image dans une QMdiArea


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Référence d'objet pour l'affichage d'image dans une QMdiArea
    Bonjour à tous,

    J'ai récupéré et adapté un code pour me permettre d'afficher une image dans une QMdiArea.

    Et mon problème est que le QPainter que j'utilise est mal initialisé ou mal utilisé, et la je commence à m'arracher les cheveux.

    Pour aider voici mon code

    le .h
    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
    21
    22
    23
    24
    25
    26
    27
     
    #ifndef MDIAREA_H
    #define MDIAREA_H
     
    #include <QMdiArea>
    #include <QPainter>
    #include <QImage>
    #include <QResizeEvent>
    #include <QRect>
     
    class MdiArea : public QMdiArea
    {
    	Q_OBJECT
     
    public:
    	MdiArea(QWidget *parent = (QWidget*)Q_NULLPTR);
    	~MdiArea();
     
    protected:
    	void resizeEvent(QResizeEvent *resizeEvent);
     
    private:
    	QImage *m_Img;
    	QWidget *m_Parent;
    };
     
    #endif // !MDIAREA_H
    et le .cpp
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include "MdiArea.h"
    
    MdiArea::MdiArea(QWidget *parent) : QMdiArea(parent), m_Parent(parent) {
    
    	m_Img = new QImage(":/Background/central");
    }
    
    MdiArea::~MdiArea() {
    	delete m_Img;
    	delete m_Parent;
    }
    
    
    void MdiArea::resizeEvent(QResizeEvent *resizeEvent) {
    
    	QImage *newBackground = new QImage(m_Parent->size(), QImage::Format_RGB32);
    	QPainter *painter = new QPainter(newBackground);
    
    	painter->fillRect(m_Parent->rect(), QColor(212, 208, 200));
    
    	QImage *scaledImg = new QImage( m_Img->scaled(m_Img->size(), Qt::IgnoreAspectRatio) );
    	QRect *scaledRect = new QRect( scaledImg->rect() );
    
    	scaledRect->moveTo(newBackground->rect().topLeft());
    	painter->drawImage(new QRect(0, 0, m_Parent->size().width(), m_Parent->size().height()), scaledImg);
    	setBackground(*newBackground);
    
    	QMdiArea::resizeEvent(resizeEvent);
    }
    Le problème se situe au niveau de la ligne 25 : painter->drawImage( ... );
    J'ai la flèche qui est soulignée en rouge avec le tooltip

    drawImage

    aucune instance de fonction surchargée "QPainter::drawImage" ne correspond à la liste d'arguments
    les types sont : (QRect *,QImage *)
    le type d'objet est : QPainter
    alors que la doc donne pour drawImage de QPainter
    void QPainter::drawImage(const QRect & rectangle, const QImage & image)

    This is an overloaded function.

    Draws the given image into the given rectangle.

    Note: The image is scaled to fit the rectangle, if both the image and rectangle size disagree.
    Il doit y avoir un truc sur les pointeurs que j'ai pas compris.
    Mais la je cale.

    Si quelqu'un peut m'explique, merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, pourquoi avoir une donnée membre m_parent (et surtout, pourquoi faire explicitement un delete dessus) QMdiArea hérite de QFrame, qui hérite de QWidget. C'est suffisant pour que le lien parent enfant soit correctement géré sans que tu n'aie rien à faire d'autre que de transmettre le parent recu en paramètre du constructeur de ta classe au constructeur de QMdiArea

    Ensuite, tu n'as absolument aucune raison d'utiliser un pointeur sur QImage ni d'avoir recours à l'allocation dynamique pour celle-ci.

    Ta classe devrait donc ressembler d'avantage à quelque chose comme
    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
    class MdiArea : public QMdiArea
    {
    	Q_OBJECT
     
    public:
    	MdiArea(QWidget *parent = (QWidget*)Q_NULLPTR);
     
    protected:
    	void resizeEvent(QResizeEvent *resizeEvent);
     
    private:
    	QImage m_Img;
    };
     
    #endif // !MDIAREA_H
     
    MdiArea::MdiArea (QWidget *parent):QMdiArea(parent){
        m_Img.load(":/Background/central");
    }
    Enfin, tu devrais vérifier les paramètres requis par la fonction drawImage de QPainter. Tu te rendrais compte qu'elle utilise systématiquement des référence sur les élément requis. Sans compter le fait que je compte au moins quatre fuites mémoire rien que dans l'implémentation de ton resizeEvent

    En fait, tu ferais sans doute bien de t'intéresser à l'ensemble de la documentation relative à QPainter et aux différents exemples qui sont donnés avec, parce que là, tu fais vraiment n'importe quoi .

    NOTA: Rien ne t'empêche de créer une donnée membre de type QPainter dans ta classe. Cela pourrait te simplifier la vie lors de l'implémentation de ta fonction resizeEvent
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Merci de m'aider.

    Pour répondre à la question, je pensais utiliser m_Parent pour pouvoir récupérer sa taille dans de resizeEvent.

    Si j'ai bien compris, j'ai tout faux

    bon je vais me remettre au boulot

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par dan34 Voir le message
    Merci de m'aider.

    Pour répondre à la question, je pensais utiliser m_Parent pour pouvoir récupérer sa taille dans de resizeEvent.

    Si j'ai bien compris, j'ai tout faux
    Heu, oui, à peu près...

    Si tu veux des informations liées au parent, intéresse-toi à la fonction (héritée de QObject) parent().

    Mais fais gaffe: c'est un pointeur qui peut valoir nullptr. Tu devras donc toujours t'assurer qu'il pointe vers une adresse valide
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Pour ceux que ça intéresse :

    En fait c'est tout bête, voici le code pour afficher une image en fond de QMdiArea et pour quelle se redimensionne en même temps que la fenêtre

    Le .h
    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
    21
    22
    23
    24
    25
     
    #ifndef MDIAREA_H
    #define MDIAREA_H
     
    #include <QMdiArea>
    #include <QImage>
    #include <QResizeEvent>
    #include <QBrush>
     
    class MdiArea : public QMdiArea
    {
    	Q_OBJECT
     
    public:
    	MdiArea(QWidget *parent = (QWidget*)Q_NULLPTR);
    	~MdiArea();
     
    protected:
    	void resizeEvent(QResizeEvent *resizeEvent);
     
    private:
    	QImage m_Img;
    };
     
    #endif // !MDIAREA_H
    Le .cpp
    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
     
    #include "MdiArea.h"
     
    MdiArea::MdiArea(QWidget *parent) : QMdiArea(parent) {
     
    	m_Img.load(":/Background/central");   // utilisation d'une ressource
    }
     
    MdiArea::~MdiArea() {
    }
     
    void MdiArea::resizeEvent(QResizeEvent *resizeEvent) {
     
    	QBrush brush = QBrush(m_Img.scaled(size(), Qt::IgnoreAspectRatio));
    	setBackground(brush);
     
    	QMdiArea::resizeEvent(resizeEvent);
    }
    Merci à koala01 pour l'aide apportée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD11] affichage d'image dans une table
    Par monneyray dans le forum WinDev
    Réponses: 5
    Dernier message: 21/07/2009, 08h10
  2. probleme avec l'affichage des images dans une jsp
    Par hypothese dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 27/05/2008, 16h56
  3. Probleme d'affichage d'image dans une fenetre
    Par cgregueusse dans le forum MFC
    Réponses: 1
    Dernier message: 03/08/2005, 11h08
  4. Affichage d'images dans une fenêtre
    Par tonycalv dans le forum MFC
    Réponses: 6
    Dernier message: 20/04/2005, 20h02

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