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 :

setEnabled(false); pour QBoxLayout


Sujet :

Qt

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut setEnabled(false); pour QBoxLayout
    Bonjour à tous,

    Je débute tout juste avec Qt 4 et je commence à faire une interface pour un logiciel à moi.

    Jusqu'à maintenant, j'ai plutôt bien géré les propriétés des widgets et les événements pour les modifier grâce au connect (avec le moc qu'on doit refaire à chaque fois qu'on change le .h ...!).

    Mais voilà le problème : j'aimerai faire par exemple 2 QBoxLayout dans mon layout globale, dont l'un serait caché initialement et devient visible quand on appuye "OK" dans le 1er.

    A priori, rien de compliqué, mais une fois dessiné le layout, je tente un

    "myboxlayout -> setEnabled(false);" mais ca ne le cache pas.

    voici ce que dit la doc dans 'Complete Member List for QHBoxLayout' :

    "void QLayout::setEnabled ( bool enable )
    Enables this layout if enable is TRUE, otherwise disables it.
    An enabled layout adjusts dynamically to changes; a disabled layout acts as if it did not exist.

    By default all layouts are enabled.

    See also isEnabled(). "

    Donc rien à dire, à priori ca devrait marcher.

    Je tiens à dire que j'ai refait le moc, détruit les fichiers inutiles avant la compilation ...

    Il doit y avoir un truc que j'ai pas compris avec les QBoxLayout.

    Note : dans l'un des premiers exemples du bouquin "Qt4 et C++", ils utilisent le QtDesigner un objet de type "QGroupBox" qui contient d'autres widgets et qui apparait quand on appuye sur le bouton "More". J'ai essayé de m'y adapter mais ca casse mon architecture mais j'avoue aussi que je n'arrive pas très bien à lire un ui_ !!!

    Merci d'avance pour votre aide.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut,
    un objet enabled peut être visible, cela n'as rien à voir.
    enabled veut dire en gros objet éditable ou non.

    Si tu veut le cacher, tu peut utiliser hide() et show() pour le faire apparaître.
    Ou utiliser setVisible
    http://qt.developpez.com/doc/latest/...l#visible-prop

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Justement, QBoxLayout n'a pas de hide() show() ou setVisible()

    http://qt.developpez.com/doc/latest/...t-members.html

    en plus, bien que mon QBoxLayout soit en setEnabled(false), je peux certe le voir mais même l'éditer.

    Je pense que la description de setEnabled pour un QBoxLayout est explicite, il devrait se cacher :

    "void QLayout::setEnabled ( bool enable )
    Enables this layout if enable is TRUE, otherwise disables it.
    An enabled layout adjusts dynamically to changes; a disabled layout acts as if it did not exist.

    By default all layouts are enabled.

    See also isEnabled(). "

    sauf si "adjusts dynamically " et " if it did not exist" n'est pas se que je pense. Peut etre un problème de comprehension de ma part.

    En tout cas il me faudrait une solution s'il vous plait.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    j'avais compris que tu parlais de widget et non de layout.

    Ca veut dire quoi cacher un layout??????

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    j'ai moi même pas trop capté le concept de layout,
    mais en gros un layout ca contient des widgets, c'est comme un regroupement de widget qu'on disposent à peu près comme on le souhaite.

    Moi j'aimerai, au lieu de caché chacun des widgets, cacher l'ensemble du groupement, donc le layout.

    Possible or not possible ?

    donnez moi une breve définition de layout s'il vous plait.

  6. #6
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Il veut peut-être cacher l'intérieur du layout, autrement dit les trucs qui sont dedans ?

  7. #7
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    bon, je résume ce que j'écrivais avant que le serveur me donne une internal error 500 :

    Ce que tu veux c'est apparement cacher des éléments/ou les désactiver.

    Si ton but est d'autoriser l'accès a des éléments seulement dans certaines circonstances, alors tu peux utiliser la méthode setEnabled() de chacun de ces éléments. Cette solution devenant très rapidement chiante, tu peux regrouper tes éléments, et au lieu de les mettres dans un layout, tu les mets dans un widget. Ensuite, tu joues avec les méthodes setEnabled(), hide(), show() de ce widget.

    Un layout est un objet de mise en forme, rien de plus. Tu devrais faire des tests.

    Fais la chose suivante :
    _tu fais un nouveau document sous qt designer et tu choisis Widget (le plus simple).

    _ tu glisses 4 boutons sur ce widget.

    _ ensuite tu cliques sur un espace vide de ce widget ou tu le selectionnes dans l'inspecteur d'objets (menu Tools>Objet Inspector) et tu selectionne le premier élément de ta liste qui est le form de type QWidget.

    _ Puis, dans la barre d'outils tu cliques sur les trois petites barres superposées verticalement "Lay out vertically" et tu regardes ce que ça fais.
    Tu peux aussi (je te conseille regarder le code que cela génere (menu Form>View code)

    enfin, un autre essai :
    _ tu casses le layout existant (tu reselectionne le form) puis tu appuies le boutons dans la barre d'outils à droite du "Lay out vertically" et qui s'appelle "Break Layout"

    _ tu choisis deux boutons (maintient shift pour les selectionner) et tu cliques le "Lay out horizontally", même chose pour les deux autres.

    _ tu reselectionnes ton form (le QWidget principal) et tu cliques "lay out vertically"

    a partir de là, tu devrais tout comprendre

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Kestufou Voir le message
    . Cette solution devenant très rapidement chiante, tu peux regrouper tes éléments, et au lieu de les mettres dans un layout, tu les mets dans un widget. Ensuite, tu joues avec les méthodes setEnabled(), hide(), show() de ce widget.
    Petite correction,
    tu peut (doit?) garder le/les layout. mais il faut le mettre dans une widget.
    A partir de là, tu applique les fonctions données sur cette widget.

  9. #9
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Yep, c'était implicite dans mon exemple, c'est pour cela que je lui faisais faire des tests avec l'object QWidget de base. Pour que ce soit plus visible, il aurait pu, à l'intérieur du premier widget (celui que Qt Designer crée automatiquement) créer un second widget dans lequel il poserait tous ses éléments, et ensuite il applique tous les layouts sur ce second widget.

    J'ai aussi fait cela volontairement parce que moi au début j'ai mis du temps à trouver comment 'layouter' les éléments dans la fenêtre conteneuse. J'avais pris des exemples et les éléments de la fenêtre s'adaptaient à la fenêtre, mais en ouvrant le .ui associé, je ne voyais pas le layout global.
    Qt Designer ne dessine pas le cadre rouge du layout global du widget conteneur de tous les autres, il ne le fait même pas figurer dans l'inspecteur d'objet (mais on peut le voir dans le code généré).

    Cela m'amène à l'introduction du nouveau topic que j'allais faire à peu près sur ce souci :
    J'ai un petit bouton carré (un flèche qui pointe vers le bas) et un trait horizontal à partir de ce bouton. Lorsque je clique sur ce bouton, la flèche doit faire afficher (en dessous du trait) une liste d'options avancées (en gros, le même concept que sur tout un tas de logiciels). Mais ça buggait (je dis 'buggait', car j'avais testé y'a .... 4 semaines ). Donc avant de poster un topic, je vais refaire des essais.

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    D'accord je commence à comprendre !

    En fait le LAYOUT n'a rien de concret, c'est une instance de mise en forme, des infos à donner à l'application.

    J'vais essayer tes tests ce soirs Kestufou et demain je te dis si un truc m'échape.

    Donc à priori, je dois utiliser un widget qui groupe des widgets (genre un QGroupBox *mongroupe1),

    et après si je veux je fais un : mongroupe1 -> addLayout (organisation1);

    et enfin :
    organisationGlobale -> addWidget (mongroupe1);

    le show et hide devrait donc marcher à merveille.

    J'essais ca ce soir et je vous dis demain...


    EDIT : Question :
    est ce que :
    -j'ajoute les p'tits widgets à mon GroupBox, puis mes p'tit widget à organisation1, puis organisation1 à mon GroupBox

    OU

    -j'ajoute mes p'tit widget à organisation1, puis organisation1 à mon GroupBox

  11. #11
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    J'avoue ne pas avoir tout compris tes questions
    T'es pas obligé de mettre dans un QGroupBox puisque ça fait les fonctions de container (exemple pour utiliser une liste d'éléments mutuellement exclusifs comme des radio button où un seul ne peut être validé à la fois.
    si tu veux vraiment juste cacher/reveler, un QWidget (je parle de l'objet QWidget, et pas d'un de ses dérivés) suffira.

    Concretement (sans ligne de code), tu peux faire la chose suivante :

    _Mettre ton QWidget sur ton form (ou ailleurs ou nulle part ça dépend de ton besoin).
    _tous les elements qui doivent être cachés/révélés tu leur donne en parent le QWidget précédement crée, soit directement dans l'argument du constructeur, soit plus tard avec la méthode setParent(QWidget *parent)
    http://qt.developpez.com/doc/latest/...html#setParent

    _Tu crées un layout dont le parent est également ce QWidget, puis avec tes objets déjà créés, tu les ajoute au layout avec layout->addWidget()

  12. #12
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    ok j'y suis arrivé hier soir, c'est tout con ! j'me suis prit la tête parce que pour moi un qboxlayout c'était un regroupement concret de boutons et pas une mise en forme.

    *pour les prochains qui voudront cacher un qboxlayout :
    -avoir au préalable un layout globale(globale_layout) qu'on ajouter à la fenetre
    -creer un QGroupBox *group_du_haut
    -creer les widgets (qlineedit *line_edit; qspinbox *spinbox)
    -creer un qboxlayout (qhboxlayout *layout_du_haut)
    -ajouter les widgets au layout (layout_du_haut -> addWidget(line_edit);layout_du_haut -> addWidget(spinbox);
    -ajouter le layout au groupbox (group_du_haut->addLayout(layout_du_haut);
    -enfin ajouter le groupbox au layout globale (globale_layout->addWidget(group_du_haut);

    -vous pouvez enfin cacher votre groupe : group_du_haut -> setVisible(false);


    "void QLayout::setEnabled ( bool enable )
    Enables this layout if enable is TRUE, otherwise disables it.
    An enabled layout adjusts dynamically to changes; a disabled layout acts as if it did not exist.

    By default all layouts are enabled.

    See also isEnabled(). "

    -> ca doit seulement vouloir dire que la mise en forme est prise en compte ou non!

    prob rrésolu, merci à vous 2

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

Discussions similaires

  1. [PHP 4] 0.2 <= 0.2 => false pour PHP
    Par grinder59 dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2011, 18h45
  2. JButton setEnable(false) sans changer l'aspect
    Par MustOne dans le forum Composants
    Réponses: 0
    Dernier message: 21/05/2009, 09h42
  3. condition False pour une requête
    Par guestCam dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/03/2007, 17h00
  4. enabled à false pour une ligne d'un Stringgrid
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 2
    Dernier message: 17/10/2006, 10h55
  5. [JTree] SetEnabled( false)
    Par thomas_strass dans le forum Composants
    Réponses: 3
    Dernier message: 29/04/2004, 13h20

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