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 :

Création d'un menu déroulant

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut Création d'un menu déroulant
    Bonjour tout le monde,

    je cherche à réaliser un menu déroulant avec Qt tel que :

    - Le menu contienne des titres de rubrique
    - Lorsque l'on clique sur un titre de rubrique, un widget se déroule juste en dessous du titre, poussant les autres titres dans son mouvement.
    - Lorsque l'on reclic sur un titre avec la rubrique déjà déroulée, la rubrique s'enroule à nouveau pour ne laisser apparaître que le titre.

    Je regarde actuellement du côté de QMenu dans lesquels j'essaie d'ajouter un Widget mais rien ne s'affiche pour le moment. Voici en gros l'idée :

    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
        this->setFixedSize(300, 800);
     
        QVBoxLayout *my_layout = new QVBoxLayout();
     
        QLabel *my_label = new QLabel("test");
        my_layout->addWidget(my_label);
     
        QMenu *my_menu = new QMenu("menu", this);
        my_layout->addWidget(my_menu);
     
        QMenu *my_sub_menu = new QMenu("sous-menu", my_menu);
        my_menu->addMenu(my_sub_menu);
     
        QVBoxLayout *testlayout = new QVBoxLayout();
        QWidget *widgTest = new QWidget(my_sub_menu);
        testlayout->addWidget(widgTest);
        my_sub_menu->setLayout(testlayout);
    Si vous avez une piste n'hésitez pas à me faire signe ;-)

    Merci beaucoup !
    Images attachées Images attachées  

  2. #2
    Membre averti

    Homme Profil pro
    gerant
    Inscrit en
    Mars 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 42
    Par défaut
    Salut, je ne sais pas si ça va fonctionner ou pas, mais je me lance quand-même.
    Le menu principale ne doit contenir que des "QMenu" pas de "QAction" et quand tu clic sur un item tu fais appel a un QAction qui insert des "QAction" dans le le QMenu appelant.
    je ne sais pas mais c'est la première idée qui m'ait venue a l'esprit.

  3. #3
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Je pense que ce qui vous intéresse est le framework Animation qui permet d'effectuer un déroulement tel que vous le souhaitez. Pour ma part, je vous aurais plutôt conseillé d'utiliser QML pour ce genre de chose ; la technologie est parfaitement adaptée aux animations, quelles qu'elles soient (déroulement accéléré avec rebondissement, déroulement progressif, etc.). Si vous souhaitez utiliser des widgets natifs comme avec la version C++ de Qt, il vous suffira d'utiliser la lib Qt-components, maintenant incluse par défaut avec Qt.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  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
    Un exemple pour faire un menu avec animation (en utilisant des VBoxLayout et QPUshButton). C'est améliorable mais c'est un début...

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QtGui/QMainWindow>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QWidget>
    #include <QPropertyAnimation>
     
    class CheckableMenu : public QWidget
    {
        Q_OBJECT
    public:
        CheckableMenu(QWidget *parent = 0)
            : QWidget(parent), isChecked(false), animation(this, "size")
        {
            animation.setDuration(1000);
     
            layout = new QVBoxLayout;
            layout->setContentsMargins(0, 0, 0, 0);
            layout->setSpacing(0);
            setLayout(layout);
        }
     
        void addWidget(QWidget *widget) {
            layout->addWidget(widget);
        }
     
    public slots:
        void checked() {
            if (isChecked) {
                animation.setStartValue(QSize(width(), 0));
                animation.setEndValue(lastSize);
                animation.start();
                isChecked = false;
            } else {
                lastSize = size();
                animation.setStartValue(lastSize);
                animation.setEndValue(QSize(width(), 0));
                animation.start();
                isChecked = true;
            }
        }
     
    private:
        QVBoxLayout* layout;
        bool isChecked;
        QSize lastSize;
        QPropertyAnimation animation;
    };
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = 0) : QMainWindow(parent)
        {
            QWidget* w = new QWidget;
            QVBoxLayout* l = new QVBoxLayout;
            l->setContentsMargins(0, 0, 0, 0);
            l->setSpacing(0);
            w->setLayout(l);
            setCentralWidget(w);
     
            QPushButton* item1 = new QPushButton("item 1");
            l->addWidget(item1);
     
            CheckableMenu* submenu1 = new CheckableMenu();
            l->addWidget(submenu1);
            connect(item1, SIGNAL(clicked()), submenu1, SLOT(checked()));
     
            QPushButton* subitem1 = new QPushButton("sub item 1");
            submenu1->addWidget(subitem1);
            QPushButton* subitem2 = new QPushButton("sub item 2");
            submenu1->addWidget(subitem2);
            QPushButton* subitem3 = new QPushButton("sub item 3");
            submenu1->addWidget(subitem3);
     
            QPushButton* item2 = new QPushButton("item 2");
            l->addWidget(item2);
     
            QPushButton* item3 = new QPushButton("item 3");
            l->addWidget(item3);
     
            l->addStretch(1);
        }
    };
     
    #endif // MAINWINDOW_H

  5. #5
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Bonjour,

    merci beaucoup gbdivers et Amnell !

    Edit :

    Je suis en train de voir pour le menu et je cherche maintenant à faire un menu déroulant tel que :

    - Quand je clic sur un titre de rubrique, lorsque la rubrique se déroule et devient visible sous le titre de rubrique, tout le bas du menu se translate pour suivre le mouvement.

    - De même, si une rubrique est ouverte, en cliquant sur le titre de celle-ci, elle se rétracte et entraîne dans son mouvement la translation de l'ensemble du menu en dessous d'elle.

    Pour gérer ceci, j'ai pensé utiliser mon QVboxLayout, dans lequel je construis mon menu, comme liste de mes QCheckableMenu. Seulement, lorsque mes QCheckableMenu, qui représente mes rubriques sous les titres, sont redimensionnés par une animation (déroulement/enroulement), le layout n'est pas mis à jour (j'ai essayé un update() sur le layout, un updateGeometry() sur le checkableMenu qui est animé mais aucun résultat).
    En fait, le layout garde la taille avec le checkableMenu déroulé (lorsqu'il s'enroule après un clic sur le titre de la rubrique, on le voit bien s'enrouler mais le layout reste figé, la rubrique qui s'enroule est remplacé par un espace blanc en gros).

    Avez-vous une idée ?

    Je vous remercie
    Images attachées Images attachées  

Discussions similaires

  1. Création d'un menu déroulant
    Par solorac dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/10/2008, 11h07
  2. [Spreadsheet Excel Writer] Création d'un menu déroulant
    Par xianxian620 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/06/2008, 10h57
  3. création d'un Menu déroulant
    Par pigeon11 dans le forum Struts 1
    Réponses: 1
    Dernier message: 20/09/2007, 09h21
  4. création d'un menu déroulant
    Par coco38 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/04/2007, 10h15
  5. Réponses: 8
    Dernier message: 06/07/2006, 08h19

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