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 :

Redimensionner un widget en fonction du widget conteneur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Par défaut Redimensionner un widget en fonction du widget conteneur
    Bonjour à tous,

    Je vous expose mon problème.

    J'ai un widget (QWidget) qui contient un Layout (QVBoxLayout) et ce layout contient un widget OpenGL (QGLWiget) et un QPushButton.
    J'aimerais que lorsque la fenêtre principale est redimensionnée, alors le widget QGLWidget soit redimensionné en conséquence. Car sinon le QGLWidget reste avec une taille fixe alors que la Widget conteneur est redimensionné...
    J'ai trouvé la méthode void QWidget::resizeEvent(QResizeEvent*) et j'ai essayé de faire quelque chose.

    Voici quelques bouts de monde code, vous verrez ce que j'ai essayé de faire dans la méthode MainWindow::resizeEvent(QResizeEvent*) pour changer la taille du widget QGLWidget. Je tente un setFixedSize(...) pour assigner la nouvelle taille. Seulement la fenêtre se redimensionne bien toute seule mais à l'infini, ce qui fait planter mon application au final.
    Le problème peut venir du setFixedSize() étant donné que je suis dans un layout et que normalement les widget dans les layouts se redimensionnent avec la fenêtre. Mais si je ne mets pas de setFixedSize() à l'initialisation le widget n'est pas affiché.
    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
     
    /* Classe MainWindow, classe qui contient le layout */
     
    #include <QWidget>
    #include <QResizeEvent>
     
    #include "layout.h"
     
    class MainWindow : public QWidget
    {
        Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = 0);
    private:
        Layout *layout;
        void resizeEvent(QResizeEvent *);
    signals:
     
    public slots:
     
    };
     
    MainWindow::MainWindow(QWidget *parent) :
        QWidget(parent)
    {
        this->layout = new Layout(this);
        this->setLayout(this->layout);
        this->setWindowTitle(QString("My App"));
    }
     
     
    void MainWindow::resizeEvent(QResizeEvent * event)
    {
        SceneDisplayer *scene =  this->layout->getGlScene();
        scene->resizeGL(this->width(), this->height());
        //scene->setFixedSize(width(), height());
    }
    Si quelqu'un a la solution ou même une idée de solution ça m'aidera sûrement !
    J'imagine que c'est quelque chose de tout bête mais ça m'échappe...

    Merci d'avance !

  2. #2
    Membre éclairé
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par défaut
    Je pense que les mutateurs QWidget::resize(...) et QWidget::setGeometry(...) peuvent t'aider dans ta tâche; pour rappel, QGLWidget hérite de QWidget. Tu peux aussi jeter un coup d'œil du côté des classes QRect et QSize, même si ça peut s'avérer facultatif.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Par défaut
    Bonjour,

    Merci de ta réponse.
    Je sais bien que QGLWidget hérite de QWidget, c'est bien pour ça que j'ai essayé un setFixedSize() sur mon QGLWidget.
    J'ai essayé avec la méthode QWidget::resize(), plus d'agrandissement infini de la fenêtre mais quand je redimensionne la fenêtre principale ça ne change pas pour autant la taille de mon widget QGLWidget...
    Pour QRect et QSize pas besoin de m'en servir à priori, je me sers directement des accesseurs width() et height().

  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
    Bonjour

    Je comprend pas très bien ce que tu fais.
    Un layout sert a redimenssionner automatiquement les widgets.
    1. Si tu utilises en même temps d'autres méthodes (sizeEvent, setGeometry), il va avoir du mal à faire son boulot
    2. que fait ton Layout particulier pour que tu as besoin de créer une classe ? (remarque : "Layout" est un nom moisi, c'est une classe plus spécialisée que QVBoxLayout et pourtant son nom est plus générique, donc moins informatif, que la classe de base)
    3. "this->" est facultatif et lourd à la lecture, à virer
    4. a quel moment tu mets ton QGLWidget dans ton layout ?

    Bref, un code simple comme celui là fonctionne parfaitement :
    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
    #include <QWidget>
    #include <QVBoxLayout>
    #include <QPushButton>
     
    class MainWindow : public QWidget
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = 0) : QWidget(parent)
        {
            QVBoxLayout* layout = new QVBoxLayout;
            QPushButton* button = new QPushButton("Test");
            layout->addWidget(button);
            setLayout(layout);
        }
    };
    Un conseil général : veut mieux faire simple et qui fonctionne que compliqué et qui fonctionne pas

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Par défaut
    Problème résolu, j'avais simplement un setFixedSize, ce qui empêchait le redimensionnement...

    Merci quand même.

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

Discussions similaires

  1. Passage pointeur widget dans fonction
    Par rafale001 dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 03/01/2011, 10h29
  2. Réponses: 2
    Dernier message: 07/10/2010, 17h13
  3. Lancer une fonction sans widget ( débutant )
    Par LM_programme dans le forum GTK+
    Réponses: 5
    Dernier message: 17/03/2010, 13h07
  4. Fonction pour widgets
    Par SeKai dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 21/01/2010, 17h48
  5. Taille des widgets en fonction de la dimension de la fenetre
    Par flo_k dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 07/12/2008, 22h13

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