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 :

QWidget::sizeHint() n'est appelé qu'une fois


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut QWidget::sizeHint() n'est appelé qu'une fois
    Bonjour, je teste actuellement QWidget::sizeHint() pour une future application qui au cour de son exécution peut changer de dimensions...

    J'ai le code suivant :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "Fenetre.hpp"
     
    int main(int argc, char *argv[])
    {
            QApplication app(argc, argv);
     
            Fenetre i;
     
            return app.exec();
    }
    Fenetre.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
     
    #ifndef FENETRE_HPP
    #define FENETRE_HPP
     
    #include <QtGlobal>
    #include <QtCore>
    #include <QtGui>
     
    class Fenetre : public QWidget
    {
        Q_OBJECT
     
        private:
            QPushButton* m_buttonA;
            QPushButton* m_buttonB;
            int m_size;
     
        protected:
     
     
        public:
            Fenetre(QWidget* widgetParent = 0);
            virtual ~Fenetre();
     
            virtual QSize sizeHint() const;
     
            Q_SLOT void setButton();
            Q_SLOT void setSize();
     
    };
     
    #endif // FENETRE_HPP
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include "Fenetre.hpp"
     
    Fenetre::Fenetre(QWidget* widgetParent)
        : QWidget(widgetParent),
          m_size(150)
    {
        m_buttonA = new QPushButton("Clique ! A", this);
            QObject::connect(m_buttonA, SIGNAL(clicked()), this, SLOT(setButton()));
     
        m_buttonB = new QPushButton("Clique ! B", this);
            QObject::connect(m_buttonB, SIGNAL(clicked()), this, SLOT(setSize()));
     
        QVBoxLayout *layout = new QVBoxLayout;
            layout->addWidget(m_buttonA);
            layout->addWidget(m_buttonB);
     
        this->setLayout(layout);
        this->show();
    }
     
    Fenetre::~Fenetre()
    {
     
    }
     
    QSize Fenetre::sizeHint() const
    {
        return QSize(m_size, m_size);
    }
     
    void Fenetre::setButton()
    {
        m_buttonA->setText(QString::number(this->width()) + " et " + QString::number(this->height()));
    }
     
    void Fenetre::setSize()
    {
        int newSize = 500;
        m_size = newSize;
        this->updateGeometry();
    }
    Quand je clique sur le bouton B, le widget n'est pas redimensionner, pourquoi ? Suis-je obliger de passer par QWidget::resize() ?

    Merci d'avance pour votre aide.
    Dernière modification par johnlamericain ; 18/08/2011 à 00h52.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Personnellement j'utilise un resize pour redimensionner un fenêtre.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui mais normalement sizeHint() doit faire l'affaire... Il n'y a pas une erreur dans le code ou quelques chose qui explique que cela ne fonctionne pas. La doc précise pourtant que sizeHint() est bien appelé quand on utilise updateGeometry()...

  4. #4
    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
    Call this function if the sizeHint() or sizePolicy() have changed.
    Appelez cette fonction si le sizeHint() ou le sizePolicy() a été changé.
    Donc, updateGeometry n'est pas appelé après le sizeHint mais il faut l'appeler soi-même après avoir fait un sizeHint.

    Bref, utilise resize(), c'est fait pour cela

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    D'abord, pour utiliser le sizeHint(), il faut vérifier que la sizePolicy de ton widget soit "Preferred/Preferred". Ensuite, il faut savoir que la sizePolicy est dépendante du contenu de ta fenêtre, et est normalement définie par le layout contenu dans ta fenêtre. Il est donc possible que l'ajout de certains widgets/layout modifient la sizePolicy de ton widget, et que ton sizeHint ne soit donc jamais appelé.

    Je n'ai jamais vraiment fouiné dans le code de QWidget, mais je pense que tu y trouveras tes réponses.

    G.

    Edit : Vu les le layout utilisé (QVBox) et les Widgets enfants (QPushButton), il est fort probable que ceux ci modifient le sizePolicy de ton widget parent. En effet, tous ces éléments sont "orientés dans une direction", et ont donc des sizePolicy particulières.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci pour votre aide, c'est compris.

  7. #7
    Invité
    Invité(e)
    Par défaut
    J'ai quand même une autre question... Dans ce cas alors... A quoi peut bien servir updateGeometry() s'il ne redimensionne pas le widget avec sizeHint() ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/02/2013, 13h27
  2. Réponses: 0
    Dernier message: 08/03/2010, 15h19
  3. appel d'une fonction qui est dans une autre page
    Par guppy33 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/08/2006, 12h05
  4. Réponses: 1
    Dernier message: 22/12/2005, 17h28
  5. Réponses: 7
    Dernier message: 25/10/2005, 15h19

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