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 :

Comportement bizarre d'une variable dynamique

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut Comportement bizarre d'une variable dynamique
    salut a tous

    j'utilise la classe "BorderLayout" du Qt dans mon projet et j'ai rencontré comportement bizarre.

    Dans la classe j'utilise un variable booléenne "largeur" que j'avais besoin dans mon fenêtre principale:

    borderlayout.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
    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
    #ifndef BORDERLAYOUT_H
    #define BORDERLAYOUT_H
    
    #include <QLayout>
    #include <QRect>
    #include <QWidgetItem>
    
    class BorderLayout : public QLayout
    {
    public:
    
        bool largeur;
    
        enum Position { West, North, South, East, Center };
    
        BorderLayout(QWidget *parent, int margin = 0, int spacing = -1);
        BorderLayout(int spacing = -1);
        ~BorderLayout();
    
        void addItem(QLayoutItem *item);
        void addWidget(QWidget *widget, Position position);
        Qt::Orientations expandingDirections() const;
        bool hasHeightForWidth() const;
        int count() const;
        QLayoutItem *itemAt(int index) const;
        QSize minimumSize() const;
        void setGeometry(const QRect &rect);
        QSize sizeHint() const;
        QLayoutItem *takeAt(int index);
    
        void add(QLayoutItem *item, Position position);
    
    private:
        struct ItemWrapper
        {
            ItemWrapper(QLayoutItem *i, Position p) {
                item = i;
                position = p;
            }
    
            QLayoutItem *item;
            Position position;
        };
    
        enum SizeType { MinimumSize, SizeHint };
        QSize calculateSize(SizeType sizeType) const;
    
        QList<ItemWrapper *> list;
    };
    
    #endif
    et layoutborder.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
    55
    56
    57
    58
    59
    60
    61
    ...
    
    void BorderLayout::setGeometry(const QRect &rect)
     {
         largeur=false;
         ItemWrapper *center = 0;
         int westWidth = 0;
         int northHeight = 0;
         int centerWidth = 0;
         int i;
    
         QLayout::setGeometry(rect);
    
         for (i = 0; i < list.size(); ++i) {
             ItemWrapper *wrapper = list.at(i);
             QLayoutItem *item = wrapper->item;
             Position position = wrapper->position;
    
             if (position==West){
                 item->setGeometry(QRect(westWidth,0,item->sizeHint().width(),rect.height()));
                 westWidth+=item->geometry().width()+spacing();
             }else if(position == Center) {
                 center = wrapper;
              }
         }
    
         centerWidth= rect.width() - westWidth;
    
    
         for (i = 0; i < list.size(); ++i) {
             ItemWrapper *wrapper = list.at(i);
             QLayoutItem *item = wrapper->item;
             Position position = wrapper->position;
             if (position==North)  {
                 item->setGeometry(QRect(westWidth,0,centerWidth,item->sizeHint().height()));
                 northHeight+=item->geometry().height()+spacing();
             }
    
         }
         if (center)
             center->item->setGeometry(QRect(westWidth, northHeight,
                                             centerWidth,
                                             rect.height()-northHeight));
    
         for (i = 0; i < list.size(); ++i) {
             ItemWrapper *wrapper = list.at(i);
             QLayoutItem *item = wrapper->item;
             Position position = wrapper->position;
    
             if(position==West){
                 item->setGeometry(QRect(0,northHeight,item->sizeHint().width(),rect.height()-northHeight));
                 largeur=true;
    
                 std::cout << "Largeur: " <<  largeur  << std::endl ;
             }
    
         }
         }
    
    ...
    et dans ma fenetre.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
    Window::Window()
    {
        QTextBrowser *centralWidget = new QTextBrowser;
        centralWidget->setPlainText(tr("Central widget"));
    
        QHBoxLayout *hbox= new QHBoxLayout;
        QWidget *widget = new QWidget;
    
        BorderLayout *layout = new BorderLayout;
    
    
        layout->addWidget(createLabel("North"), BorderLayout::North);
        layout->addWidget(centralWidget, BorderLayout::Center);
        layout->addWidget(createLabel("West"), BorderLayout::West);
    
        setLayout(layout);
    
        std::cout << "Largeur:------" <<  layout->largeur  << std::endl ;
    :

    mon problème est la variable "largeur" prend la bonne valeur a l'interieur de la classe "borderlayout" et lorsque je fais un appel de cette variable dans la classe "window" elle change en une valeur bizarre:voici l'affichage test que j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Largeur:--------------7471206
    Largeur: 1
    Largeur: 1
    j'ai besoin d'aide ici et merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 145
    Par défaut
    A mon avis, BorderLayout::setGeometry est appelé après le constructeur de Window, ce qui expliquerait la valeur bizarre (variable non initialisée), et la sortie de cout.

    As-tu essayé d'initialiser largeur dans le constructeur de BorderLayout ?
    Ça devrait résoudre le problème.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    merci pour votre réponse

    j'ai fais comme tu as dis et j'ai initialiser la variable "largeur=0" dans les constructeurs de BorderLayout. La valeur bizarre se s'affiche plus mais et devient "0" mais elle ne change jamais à "1" malgré la condition est juste ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 145
    Par défaut
    Là je vois pas... Voilà ce que je te propose :

    1) respecte le principe de l'encapsulation pour largeur
    2) utilise qDebug à la place de std::cout.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    BorderLayout::setGeometry est appelé a chaque fois ou je fais "layout->addWidget" donc forcement il faut que "largeur" prend la valeur "1" mais ce n'est pas le cas!
    je me gene là

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/02/2007, 00h02
  2. Ajout d'une variable dynamique de type pointeur
    Par mmooaa dans le forum Langage
    Réponses: 3
    Dernier message: 02/01/2007, 23h04
  3. Enregistrement d'une variable dynamique dans un fichier
    Par zarbydigital dans le forum Langage
    Réponses: 13
    Dernier message: 24/12/2005, 21h28
  4. [langage] Comportement étrange d'une variable
    Par Spaz dans le forum Langage
    Réponses: 6
    Dernier message: 23/04/2004, 11h29
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

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