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 :

Rendre un label cliquable

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 38
    Par défaut Rendre un label cliquable
    Bonjour,

    Oh, ce n'est pas si facile de débuter. Et donc pardonnez-moi par avance pour la naïveté de mes questions.

    Utilisation de Qt sous windoxs XP.

    Je voudrais rendre un label cliquable .
    Et que lorsque le label1 est cliqué il rende un label2 invisible

    Merci pour votre aide

  2. #2
    Membre éprouvé
    Avatar de GreatTux
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 77
    Par défaut
    Il est possible de créer un label cliquable (en créant une nouvelle classe héritant de QLabel, avec un eventFilter...).
    Mais peut être qu'il est simplement plus judicieux d'utiliser un QPushButton à la place du label ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 38
    Par défaut
    Bonsoir,

    Merci pour votre réponse

    J'ai dans l'idée (peut-être tordue ou totalement fausse) de créer des 'labels' et les utiliser pour enter/modifier des informations réparties sur 3 personnes.

    Au départ voici comment se présente l'écran. Les lettres sont grisées.
    personne1
    B V R G O N

    personne 2
    B V R G O N

    personne3
    B V R G O N

    Puis si l'utilisateur clique sur B de la personne1, B passe en foncé et les B de la personne2 et celui de la personne3 deviennent invisibles.

    Si l'utilsateur reclique sur B(le seul) de la personne1, les 3 B réapparaissent en grisé. La sélection a été annulée.

    Merci de votre aide

  4. #4
    Membre éprouvé
    Avatar de GreatTux
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 77
    Par défaut
    Je pense que le plus simple est de partir sur des QPushButton pour les lettres. Si ce qui vous pose un problème c'est leur apparence (de bouton et pas de label), vous pouvez les définir comme "flat", setFlat(true) ou alors leur appliquer un style, setStyleSheet, qui ressemblerai à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    QPushButton
    {
      border: 0px;
      background: none;
    }
    L'avantage des QPushButton est qu'ils ont déjà tout ce dont vous avez besoin, c'est à dire les signaux clicked(), que vous pourrez brancher à un/des slots de votre choix.
    Il peut également être judicieux de tirer partie de la fonction "checkable", setCheckable(true), des QPushButton, qui leur permettra d'avoir la notion état comme une checkbox afin de gérer le coté grisé ou pas. Auquel cas on pourra faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    QPushButton
    {
      border: 0px;
      background: none;
      color: gray; /* gris par defaut */
    }
     
    QPushButton:checked
    {
      color: black;
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Merci pour votre réponse. Je vais donc partir sur des 'pushButtons'.
    Je définis donc 6 'pushButtons' sur une form. Je les renomme avec les lettres B V R G O N .
    Je me place dans : mainwindow.h
    et j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private slots :
    void on_pushButton1_clicked();
    void on_pushButton2_clicked();
    void on_pushButton3_clicked();
    void on_pushButton4_clicked();
    void on_pushButton5_clicked();
    void on_pushButton6_clicked();
    puis je ma place dans mainwindow.cpp
    et j'écris:


    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
    void on_pushButton1_clicked()
    {
    //si le bouton est gris  alors le mettre en noir et rendre invisible les boutons (possédant la même lettre) des deux autres personnes
    if (ui.pushButton1.color==gray)
    {
    ui.pushButton1.color=black;
    ui.pushButton7.hide();
    ui.pushButton13.hide();
     
    }
     
    //si le bouton est noir alors le mettre en gris et faire réapparaitre en gris les boutons(possédant la même lettre) des deux autres personnes
    if (ui.pushButton1.color==black)
    {
    ui.pushButton1.color=gray;
    ui.pushButton7.show();
    ui.pushButton13.show();
     
    }
     
     
    }

    Est-ce correcte?

    Merci

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Pour commencer, il faut d'indenter le code.
    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
    void on_pushButton1_clicked()
    {
        //si le bouton est gris  alors le mettre en noir et rendre invisible les boutons (possédant la même lettre) des deux autres personnes
        if (ui.pushButton1.color==gray)
        {
            ui.pushButton1.color=black;
            ui.pushButton7.hide();
            ui.pushButton13.hide();
        }
     
        //si le bouton est noir alors le mettre en gris et faire réapparaitre en gris les boutons(possédant la même lettre) des deux autres personnes
        if (ui.pushButton1.color==black)
        {
            ui.pushButton1.color=gray;
            ui.pushButton7.show();
            ui.pushButton13.show();
        }
    }
    On y voit mieux (même si c'était simple).

    Ensuite problème d'algorithmie. Si le bouton est gris, tu le passes en noir, et juste après s'il est noir, tu le passes en gris. Donc il ne sera pas resté noir longtemps x)

    Reprenons à partir de ton problème.
    Il serait plus propre d'utiliser un bouton "checkable". Autrement dit un bouton qui s'enfonce en un clic, et se re-soulève au clic suivant. Libre à toi de définir le style d'un bouton enfoncé (noir) ou au repos (gris), GreatTux a expliqué comment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void on_pushButton1_clicked()
    {
        //si le bouton est gris  alors le mettre en noir et rendre invisible les boutons (possédant la même lettre) des deux autres personnes
        //si le bouton est noir alors le mettre en gris et faire réapparaitre en gris les boutons(possédant la même lettre) des deux autres personnes
        ui->pushButton7->setVisible(!ui->pushButton1->isChecked());
        ui->pushButton13->setVisible(!ui->pushButton1->isChecked());
    }
    En effet, il faut séparer le style du fonctionnel, afin de les faire évoluer indépendamment.

    Par contre là tu vas devoir faire 18 slots, c'est très laborieux. Une autre façon de faire : relier tous les boutons (signal clicked() ) au même slot. Tu as un moyen ensuite de savoir qui a déclenché le slot grâce à sender().

    Ensuite tu peux trouver une façon intelligente de nommer les boutons et les traiter en un minimum de lignes de code. Supposons qu'ils s'appellent "pushButton1" à "pushButton18".
    Boutons liés :
    1-7-13
    2-8-14
    ...
    n - n+6 - n+12

    Pour un bouton i :
    - si i <= 6, on agit sur i+6 et i+12
    - si 6 < i <= 12, on agit sur i-6 et i+6
    - si i > 12, on agit sur i-12 et i-6
    => Pour un bouton i, on agit sur j = ((i+5)%18)+1 et k = ((i+11)%18)+1 (% c'est modulo)

    Après il suffit de chercher les boutons "pushButton" + QString::number(j) et "pushButton" + QString::number(k).

    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
    void buttonClicked()
    {
        QPushButton* button = qobject_cast<QPushButton*>(sender());
     
        // numéro du bouton
        int i = button->objectName().remove("pushButton").toInt();
     
        int j = (i+5)%18+1;
        QPushButton* l_pLinkedButton = findChild<QPushButton*>("pushButton" + QString::number(j));
        if (l_pLinkedButton)
            l_pLinkedButton->setVisible(!button->isChecked());
     
        int k = (i+11)%18+1;
        l_pLinkedButton = findChild<QPushButton*>("pushButton" + QString::number(k));
        if (l_pLinkedButton)
            l_pLinkedButton->setVisible(!button->isChecked());
    }
    Pour le nom, au lieu de les numéroter pushButton1 à 18, on peut faire mieux en les appelant B1 B2 B3, V1 V2 V3, etc. même si ça ne change pas grand chose.

    N'hésite pas si tu as des questions, si je t'ai perdu.

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

Discussions similaires

  1. [C#]Comment rendre un label transparent ?
    Par Kcirtap dans le forum Windows Forms
    Réponses: 20
    Dernier message: 05/08/2009, 16h35
  2. Modification d'un label cliquable dans une même fenêtre
    Par simtim dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 29/04/2007, 13h07
  3. rendre une page cliquable
    Par gloglo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/01/2007, 10h48
  4. Rendre un JPanel cliquable
    Par littleshrimp dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 15/05/2006, 14h18
  5. [C#2] Comment rendre un label "multi styles" ?
    Par kunfuka dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/04/2006, 10h35

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