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 :

Hériter de QGraphicsview [Graphics View]

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut Hériter de QGraphicsview
    Hello,

    J'ai créer un nouvelle classe ColorPickerView qui hérite de QGraphicsView dans le but de re définir la méthode de dessin du fond, et de spécialiser le comportement.

    Cependant, depuis que j'ai fais ceci, j'ai l'impression que le comportement de QGraphicsView est quelque peu dégradé.
    En effet j'ai beau spécifier la couleur de fond via setBackgroundBrush, cet appel n'à plus d'effet...
    J'avais dans l'idée de devoir appeler le ctor parent, mais le compileur me le refuse...

    Aussi, j'ai re définis la méthode drawBackground.
    Ceci afin de dessiner deux dégradés.
    Pour cela j'ai ajouté de QGraphicsRectItem via QGraphicScene->addRect.
    Cependant, pour des question de performances constatés, je dois faire un appel à clear scene, puis re créer les deux dégradés de ma scène à chque appel de drawbackgound.
    Est la bonne méthode ?

    J'avais dans plutôt l'idée d'instancier deux QGraphicsRectItem, et de redessiner leurs zones. Mais, 1/ QGraphicScene ne me permet pas de créer des QGraphicsRectItem, secondo lorsque je fais cela l'appli rame à mort....


    Voici le code :
    Code colorpickerview.h : 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
     
    #ifndef COLORPICKERVIEW_H
    #define COLORPICKERVIEW_H
     
    #include <QGraphicsView>
     
    class ColorPickerView : public QGraphicsView
    {
        Q_OBJECT
    public:
        explicit ColorPickerView(QWidget *parent = 0);
     
    protected:
        void ColorPickerView::drawBackground( QPainter * painter, const QRectF & rect );
        double ColorPickerView::diag( );
     
    signals:
     
    public slots:
     
    };
     
    #endif // COLORPICKERVIEW_H

    Code colorpickerview.cpp : 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
    31
    32
    33
    34
     
    #include "colorpickerview.h"
    #include "math.h"
     
    ColorPickerView::ColorPickerView(QWidget *parent) :
        QGraphicsView(parent)
    {
        this->setScene(new QGraphicsScene());
        this->setRenderHint(QPainter::Antialiasing, true);
    }
     
    void ColorPickerView::drawBackground( QPainter * painter, const QRectF & rect )
    {
        this->scene()->clear();
        QRadialGradient degrade( this->contentsRect().left(),
                                 this->contentsRect().top(),
                                 this->diag() );
        degrade.setColorAt(0, Qt::white);
        degrade.setColorAt(1, Qt::transparent);
        this->scene()->addRect(this->contentsRect(),Qt::NoPen,QBrush(degrade));
     
     
     
        QLinearGradient linearGrad(0,this->contentsRect().height(),0,0);
        linearGrad.setColorAt(0, Qt::black);
        linearGrad.setColorAt(1, Qt::transparent);
        this->scene()->addRect(this->contentsRect(),Qt::NoPen,QBrush(linearGrad));
    }
     
    double ColorPickerView::diag( )
    {
        return sqrt( pow(this->contentsRect().width(),2) +
                        pow(this->contentsRect().height(),2));
    }


    Encore merci par avance !
    a plus

  2. #2
    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
    Bonjour kaymak

    A mon avis, tu n'as pas de (bonnes) raisons d'hériter de QGraphicsView...

    Le but de l'héritage est de modifier le comportement d'un objet en redéfinissant certaine méthode, en ajoutant, etc.
    Afficher un fond et des items, c'est le comportement par défaut de QGraphicsView. Tu ne modifies pas son comportement.

    Regarde le code de l'exemple sur les souris, dans main.cpp :
    - on crée une scène
    - on ajoute les items dans la scène
    - on crée une vue et on définit le background
    - on lie la scène et la vue
    Pas besoin de créer un objet héritant de la vue.

    Dans ton code, tu as une vue qui doit afficher :
    - un dégradé (qui peut un item rect ou un background)
    - un curseur
    Ta vue doit simplement afficher ces 2 objets et réagir à la souris. Ce qu'elle sait déjà faire

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    hello,

    oui effectivement.
    D'ailleurs depuis que j'ai modifié la méthode drawBackground (Avec le Qpainter reçu) pour correctement dessiner les dégradés,
    je me rends compte que le code du dessus à d'ailleurs peu de sens dans la mesure où je suis dans la méthode qui dessine avec les propriétés que j'essayais de définir... fin bref

    Par contre j'ai des petits soucis d'affichage lors du redimensionnement de la fenêtre avec QGraphicsView ::drawBackground.
    Sûrement à cause de ceci :
    Citation Envoyé par http://qt.developpez.com/doc/latest/qgraphicsscene.html#drawBackground
    If all you want is to define a color, texture, or gradient for the background, you can call setBackgroundBrush() instead.
    J'espère que cela disparaîtra avec QGraphicsItem::paint.

    Merci pour tes conseils et réponses !

    a plus

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

Discussions similaires

  1. [Héritage] Hériter de TextComponent impossible
    Par soad dans le forum Composants
    Réponses: 6
    Dernier message: 01/12/2005, 08h02
  2. Hériter de TList
    Par NotANumber dans le forum Langage
    Réponses: 10
    Dernier message: 23/11/2005, 18h35
  3. Hériter de TList
    Par NotANumber dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 22/11/2005, 18h03
  4. Réponses: 2
    Dernier message: 05/07/2005, 18h22
  5. Réponses: 7
    Dernier message: 25/03/2005, 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