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 :

Problème de dessin avec QPainter, QImage dans une QFrame


Sujet :

Qt

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut Problème de dessin avec QPainter, QImage dans une QFrame
    Bonjour à tous,

    J'essaye d'afficher une image dans une QFrame, le problème est que bien sûr rien ne s'affiche...

    Frame.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 FRAME_H
    #define FRAME_H
     
    #include <QtGui>
     
    class Frame : public QFrame
    {
     
        Q_OBJECT
     
    	private:
    		QPainter painter;
    		QImage image;
    		bool paintAll;
     
    	protected:
    		virtual void paintEvent(QPaintEvent *event);
    		virtual void mousePressEvent(QMouseEvent *event);
     
    	public:
            Frame(QWidget *parent = 0, Qt::WindowFlags f = 0);
     
    };
     
    #endif
    Frame.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
    #include "Frame.h"
     
    Frame::Frame(QWidget *parent, Qt::WindowFlags f) : 
    	QFrame(parent, f),
    	painter(this),
    	image("track.jpg"),
    	paintAll(false)
    {
    }
     
    void Frame::paintEvent(QPaintEvent *event)
    {
     
    	this->painter.drawImage(QPoint(0, 0), this->image);
     
    	if (this->paintAll)
    	{
    		this->painter.drawLine(QPoint(0, 0), QPoint(100, 100));
    	}
     
    }
    Pourtant si j'utilise des variables locales dans paintEvent pour painter et image, cela marche très bien...pouvez-vous m'éclairer sur ce problème s'il vous plaît ?

    Merci !

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    Le plus simple pour afficher une image est d'utiliser un QLabel
    http://qt.developpez.com/faq/?page=q...afficher_image

    Citation Envoyé par j0o0 Voir le message
    Pourtant si j'utilise des variables locales dans paintEvent pour painter et image, cela marche très bien...pouvez-vous m'éclairer sur ce problème s'il vous plaît ?
    A mon avis, c'est que le handle interne d'un widget peut changer ou pas encore initialisé. Tu ne peut donc initialiser un painter comme cela.
    Il faut que plusieurs widgets instancient des élément interne pendant le premier affichage.
    De plus, lors qu'un painter est associé à une widget, il me semble qu'il lock le handle pour dessiner dessus.
    C'est en gros ce que j'ai compris... et peut être à moitié faux....
    Mais tu peut regarder dans le code si tu est curieux.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    Bon ben je viens de trouver

    Pour utiliser un QPainter en tant que variable membre, il faut d'abord le créer sans passer de QPaintDevice en argument et ensuite utiliser les méthodes QPainter::begin(QPaintDevice *device) et QPainter::end()...

    Merci de ta réponse !

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Pourquoi veut tu avoir un painter en tant que variable membre?

  5. #5
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    En fait je ne cherche pas à avoir à tout prix le QPainter en membre mais plutôt l'image pour ne pas avoir à la recharger à chaque appel à paintEvent, j'avais mis le QPainter en membre par habitude simplement.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    En fait je ne cherche pas à avoir à tout prix le QPainter en membre mais plutôt l'image pour ne pas avoir à la recharger à chaque appel à paintEvent, j'avais mis le QPainter en membre par habitude simplement.
    Pour l'image ok.
    Pour le painter, je ne te garantie pas que comme cela tu ne va pas avoir des problèmes...

    Dans la doc
    http://qt.developpez.com/doc/latest/...r.html#details
    The common use of QPainter is inside a widget's paint event: Construct and customize (e.g. set the pen or the brush) the painter. Then draw. Remember to destroy the QPainter object after drawing
    C'est un peu comme un kleenex

  7. #7
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    La méthode begin(QPaintDevice * device) est appelée automatiquement dans le constructeur si on lui spécifie un QPaintDevice, et la méthode end() appelée dans le destructeur. C'est pour cette raison je pense qu'il est plus commun de l'utiliser comme un kleenex (). Mais a priori et après avoir testé ça marche aussi comme je l'ai fait...

    Mais bon mieux vaut tout de même utiliser la manière conseillée, merci de ta remarque !

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

Discussions similaires

  1. Dessiner avec ma souris dans une fenêtre
    Par stoneyanick dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 17/04/2015, 11h37
  2. Réponses: 2
    Dernier message: 17/10/2012, 09h29
  3. Réponses: 1
    Dernier message: 29/06/2012, 17h06
  4. Problème de 0 avec un Count dans une requête
    Par Exentius dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/12/2010, 08h52
  5. Réponses: 7
    Dernier message: 04/06/2006, 17h00

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