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 :

QPainter::begin: Widget painting can only begin as a result of a paintEvent

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut QPainter::begin: Widget painting can only begin as a result of a paintEvent
    Bonjour,

    Je debute sur Qt. Je trouve le warning suivant quand j'essaye d'utiliser QPainter sur un classe que j'ai appelee "Canvas" derivee de QGraphicsView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPainter::begin: Widget painting can only begin as a result of a paintEvent
    De plus, mon "Canvas" reste en blanc, et aucun desing ne s'affiche.

    J'ai redefini le paintEvent() de Canvas de la facon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Canvas::paintEvent(QPaintEvent *event)
    {
    	qDebug() << "Inside Canvas::paintEvent";
     
    	QPen pen(Qt::black, 2, Qt::SolidLine);
     
    	QPainter painter(this);
     
    	painter.setPen(pen);
    	painter.drawLine(20, 40, 250, 40);
    	painter.drawLine(20, 70, 250, 70);
    }
    NB : L'execution passe bien la dedans, car je vois dans les logs le message "Inside Canvas::paintEvent".

    La definition de ma classe Canvas est :
    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
    #ifndef CANVAS_H_
    #define CANVAS_H_
     
    #include <QGraphicsView>
    #include <QWidget>
     
    class Canvas : public QGraphicsView
    {
    	Q_OBJECT
     
    public:
    	Canvas(QWidget *parent = 0);
    	virtual ~Canvas();
     
    protected:
    	void paintEvent(QPaintEvent *event);
    };
     
    #endif /* CANVAS_H_ */
    Quelqu'un peut me donner un coup de main ou m'orienter avec ce probleme ?

    Je vous remercie d'avance.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 632
    Par défaut
    Essai de dessiner avec une QGraphicsScene plutôt qu'une QGraphcisView.

    La QGraphicsVIew représente la ScrollArea qui contient un QGrahicsScene qui elle dessine des éléments.

    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
        QGraphicsScene *scene = new QGraphicsScene(NULL, this);
        scene->setSceneRect(QRectF(0, 0, 5000, 5000));
     
        QGraphicsView *view = new QGraphicsView(scene, this);
    après tu peux ré-implémenter ça :
    void QGraphicsScene::drawBackground ( QPainter * painter, const QRectF & rect ) [virtual protected] pour dessiner le fond avant les objects
    ou ça :
    void QGraphicsScene::drawForeground ( QPainter * painter, const QRectF & rect ) [virtual protected] pour dessiner après les objects.

    Après je sais pas pourquoi tu veux faire ça, mais si tu veux un simple canvas, un widget est suffisant. le système view/scene est utilise pour gérer un grand nombre d'objets. ci ce qui t’intéresse est juste de dessiner directement sur la background alors ça te sert à rien.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par cuicui78 Voir le message
    Essai de dessiner avec une QGraphicsScene plutôt qu'une QGraphcisView.
    La QGraphicsVIew représente la ScrollArea qui contient un QGrahicsScene qui elle dessine des éléments.
    Non. Le module QGraphics est organisé selon le système MVC : la vue (QGrahicsView) est le widget affiché à l'écran ; le modèle (QGrahicsScene) est le gestionnaire d'objets ; et les items (QGrahicsItem) se dessinent eux même.

    Quelqu'un peut me donner un coup de main ou m'orienter avec ce probleme ?
    Plusieurs pistes :
    - utilise des QGrahicsLineItem plutôt que surcharger paintEvent
    - utilise un QWidget au lieu d'un QGraphicsView
    - surcharge drawBackground ou drawForeground (de la vue ou de la scène)

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/10/2010, 01h45
  2. [Integration] Jmock et Spring ( et Junit4 !) : can only set expectation on mock object
    Par elix63 dans le forum Spring
    Réponses: 0
    Dernier message: 08/07/2009, 18h07
  3. Réponses: 1
    Dernier message: 11/05/2009, 15h36
  4. Réponses: 1
    Dernier message: 22/04/2009, 16h06
  5. Can only iterate over an array or an instance of java.lang.Iterable
    Par hardokin dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 28/08/2008, 14h05

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