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 :

Graphic View et remplissage

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 76
    Par défaut Graphic View et remplissage
    Bonjour à tous !

    Je viens de réaliser un composant Qt / C++.

    Mon composant hérite de QGraphicsView :

    Customwidget.hpp:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <QGraphicsView>
    #include <QGraphicsItem>
    #include <QGraphicsScene>
    #include <QVariant>
    #include <QVector>
     
    class CustomWidget : public QGraphicsView
        {
    public :
     
        /********************************/
        /* Construction and destruction */
        /********************************/
     
        CustomWidget(QWidget *parent = 0);
        ~CustomWidget();
     
        virtual void resizeEvent(QResizeEvent *event);
     
    public slots:
        void SetLeftMargin(int p_margin);
     
        void SetRightMargin(int p_margin);
     
        int GetLeftMargin();
     
        int GetRightMargin();
     
        void ResetLeftMargin();
     
        void ResetRightMargin();
     
        void SetComponentHeight(int p_height);
     
        int GetComponentHeight();
     
        int GetComponentWidth();
     
        void SetComponentWidth(int p_width);
     
    private:
     
        QGraphicsScene*               m_pScene;         ///< The graphic scene containing the custom widget
        CustomBackground*         m_pBackground;    ///< The background (Hérite de QGraphicsObject)
     
        /**
          * \brief QList of pointer to the different part of the component.
          */
        QList<CustomScale*>       m_ScaleList;
        CustomProfil*             m_pProfilBlock;
        //[...] Plusieurs CustomTruc qui sont des pointeurs vers des sous-classes héritant de QGraphicsObject
    Customwidget.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
    31
    32
    33
    34
    35
    36
    CustomWidget::CustomWidget(QWidget* parent) : QGraphicsView(parent){
        setOptimizationFlags(QGraphicsView::DontSavePainterState);
        m_pScene = new QGraphicsScene();
        this->setFrameRect(QRect(0,0, component_width, component_height));
        m_pScene->setSceneRect(0,0, component_width, component_height);
        setScene(m_pScene);
        m_pBackground = new CustomBackground(0, component_height, component_width);
     
        m_pCustomSubWidget = new CustomSubWidget(m_pBackground, [...]);
     
        m_pScene->addItem(m_pBackground);
     
        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    }
     
    /**
     * \brief         Destructor
     */
    CustomWidget::~CustomWidget()
    {
        delete m_pBackground;
        m_pBackground = 0;
        delete m_pScene;
        m_pScene = 0;
    }
     
    void CustomWidget::resizeEvent(QResizeEvent* event)
    {
        Q_UNUSED(event);
        fitInView( m_pBackground, Qt::KeepAspectRatio );
    }
     
    [...] Getter / Setter d'un intérêt inexistant pour cette question.
     
    }
    CustomSubWidget.hpp :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <QPainter>
    #include "CustomSubWidget.hpp"
     
    /******************************************************************************/
    /* CLASS IMPLEMENTATION */
    /******************************************************************************/
     
    /********************************/
    /* Construction and destruction */
    /********************************/
     
    /**
     * \brief         Constructor
     */
    CustomSubWidget::CustomSubWidget(QGraphicsItem* p_pParent, int p_y_position)
        : QGraphicsObject(p_pParent), m_y_position(p_y_position)
    {
    }
     
    /**
     * \brief         Destructor
     */
    CustomSubWidget::~CustomSubWidget()
    {
    }
     
    /********************************/
    /*inherited from QGraphicsObject*/
    /********************************/
     
    /**
     * \brief         Overrides QGraphicsObject
     */
    void CustomSubWidget::paint(QPainter* p_pPainter,
                                const QStyleOptionGraphicsItem* p_pOption,
                                QWidget* p_pWidget)
    {
        Q_UNUSED(p_pOption);
        Q_UNUSED(p_pWidget);
     
        DrawOADStatus(p_pPainter);
    }
     
    /**
     * \brief         Returns the bounding rect of the scale
     */
    QRectF CustomSubWidget::boundingRect() const
    {
        return QRectF(40,0,1140,450);
    }
     
    /**
     * \brief         Draws OADStatus
     *
     * \param[in]     p_pPainter        The painter
     */
    void CustomSubWidget::DrawCustomSubWidget(QPainter* p_pPainter)
    {
        p_pPainter->setPen(Qt::NoPen);
     
        p_pPainter->save();
        p_pPainter->setRenderHints(QPainter::Antialiasing);
        p_pPainter->setPen(Qt::SolidLine);
        p_pPainter->setPen(QColor("red"));
     
        QRectF statusRect;
     
        QPair<int, Status> StatusPair;
        foreach(StatusPair, m_Status)
        {
    		p_pPainter->setBrush(QColor("red"));
    		statusRect.setRect(OADStatusPair.first, m_y_position-7, 10, 14);
    		p_pPainter->drawRect(statusRect);
    		break;
        }
        p_pPainter->restore();
    }
    CustomSubWidget.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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    /**
     
     
    #ifndef __CUSTOMWIDGET_HPP__
    #define __CUSTOMWIDGET_HPP__
     
    /******************************************************************************/
    /* INCLUDE FILES */
    /******************************************************************************/
     
    #include <QGraphicsObject>
    #include <QPair>
    #include "CustomSubWidget.hpp"
     
    /******************************************************************************/
    /* CLASS : CustomSubWidget */
    /******************************************************************************/
     
     
    #include <QGraphicsObject>
     
    class CustomSubWidget : public QGraphicsObject
    {
    public:
        CustomSubWidget(QGraphicsItem* p_pParent = 0, int p_y_position = 0);
        ~CustomSubWidget();
     
        /********************************/
        /*inherited from QGraphicsObject*/
        /********************************/
     
        QRectF                          boundingRect() const;
        void                            paint(QPainter *p_pPainter, const QStyleOptionGraphicsItem *p_pOption, QWidget *p_pWidget);
     
    private:
     
        /********************************/
        /*       Private methods        */
        /********************************/
     
        void                            DrawCustomSubWidget(QPainter* p_pPainter);
     
        /********************************/
        /*         Attributes           */
        /********************************/
     
        QVector< QPair<int, Status> >      m_Status;
        int                             m_y_position;
        bool                            m_hasToBeDrawn;
     
     
    };
     
    #endif // __CUSTOMWIDGET_HPP__
    En gros pour résumer, j'ai un QGraphicsView. Je rajoute une QGraphicsScene dans ce QGraphicsView. Je set le FrameRect et le SceneRect à la taille que je veux (paramétrable à la création).

    Je fais un setScene de ma QGraphicsScene dans ma QGraphicsView.

    Je rajoute un QGraphicsItem Background à cette scène.

    Et j'ajoute par la suite un certain nombre de sous-composant (CustomSubWidget ci-dessus) à mon Background.

    Pour finir, j'ajoute le background via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pScene->addItem(m_pBackground);
    à ma scène.

    Mon soucis est que l'ensemble de sous-composant se peignent mais se centre en plein milieu avec une grosse marge à droite et à gauche. (Plus grand que celle que j'ai rajouté de 40 à gauche et 20 à droite.)

    Ce widget est affiché dans un QGridLayout.

    J'ai beau tourner dans tous les sens, je ne comprend pas pourquoi mon composant persiste à ne pas vouloir prendre tout l'espace qui lui est alloué...

    Quelqu'un saurait-il m'éclairer ?

    Merci d'avance,

    Noobboy

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Sans même avoir été plus loin dans le code...

    Si ton widget hérite de QGraphicsView, il est inutile de rajouter une membre de type QGraphicsScene : QGraphicsView en a déjà un, et c'est sur celui-là que porteront toutes les fonctions relatives à l'accès / la modification de la scène dont hérite ton widget.

    Si tu modifies dans une de tes fonctions "perso" ou "redéfinies" le membre de type QGraphicsView que tu as rajouté à ton widget, les modifications ne seront, fatalement, pas prises en compte dans la scene contenue par la partie QGraphicsView !!!

    A moins (je l'ai dit, je me suis arrêté à la lecture de Customwidget.hpp ) que tu ne commences à "swapper" m_pscene et le pointeur récupéré par la fonction scene()
    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 confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 76
    Par défaut
    Et bien, effectivement, m_pScene est initialisé à view.scene();

    Si j'ai bien saisi ce que tu entendrais par "swapper" m_pscene et le pointeur récupéré par la fonction scene(). ^^"

Discussions similaires

  1. [Graphics View] Qt Graphics View et coordonnées
    Par devBox dans le forum Qt
    Réponses: 13
    Dernier message: 27/08/2010, 22h24
  2. la recharge d'un svg dans le système graphics view
    Par lansher1985 dans le forum Qt
    Réponses: 2
    Dernier message: 21/07/2009, 15h09
  3. [Graphics View Framework] Intégration dans un layout
    Par black is beautiful dans le forum Qt
    Réponses: 15
    Dernier message: 27/02/2009, 12h07
  4. Polygone dans un Graphics View
    Par rambc dans le forum PyQt
    Réponses: 1
    Dernier message: 26/08/2008, 17h08

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