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 :

QTabWidget : mise à jour du contenu d'un onglet


Sujet :

Qt

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut QTabWidget : mise à jour du contenu d'un onglet
    Bonjour à tous,

    Mon application est constituée d'une fenêtre principale, formée d'un QTabWidget à plusieurs onglets (normal ^^). L'application vise à lire et écrire dans une base de données SQLite (constituée d'un simple fichier) qui contient ma collection de disques


    Dans mon onglet d'accueil, j'affiche le nombre d'éléments contenus dans ma base. Pour cela, j'utilise une requête de type SELECT COUNT et j'affiche le résultat avec un QLCDNumber.

    Voici le code de création de l'onglet :
    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
    MyWelcomeTab::MyWelcomeTab() : QWidget()
    {
        // Comptage du nbr de disques
        int nbrDisques = MySQL_elementsCount("elements"); // fonction perso OK
        if(nbrDisques < 0)
        {
            QMessageBox::critical(\
                this,\
                tr("Erreur SQL"),\
                tr("Il a ete impossible de compter le nombre d'element dans la base de donnees. Le fonctionnement pourrait s'en trouver corrompu"));
    
        }
    
        // Creation des objets
        LCDNombreDisques = new QLCDNumber;
        LCDNombreDisques->setSegmentStyle(QLCDNumber::Flat);
        LCDNombreDisques->display(nbrDisques);
        QLabel *texteNombreDisques = new QLabel;
        texteNombreDisques->setText("Nombre de disques dans la base :");
    
        // Positionnement dans un layout
        QGridLayout *layoutWelcomeTab = new QGridLayout;
        layoutWelcomeTab->addWidget(LCDNombreDisques,0,1);
        layoutWelcomeTab->addWidget(texteNombreDisques,0,0);
        this->setLayout(layoutWelcomeTab);
    
    }//MyWelcomeTab()
    Ça marche très bien au lancement. Le problème vient du fait que ce nombre n'est pas mis à jour au cours de l'exécution du programme. Si mon programme démarre avec 10 entrées en base, que j'ajoute 2 disques via l'onglet d'ajout à la base, que je reviens à l'onglet d'accueil, et bien il affiche toujours 10. C'est assez logique, mais moi je voudrais qu'il recalcule la donnée.

    Je sais qu'en Matlab, il existe une fonction redraw qui permet de rafraichir une fenêtre, ce qui inclut de recalculer les variables la constituant. Existe t-il une telle fonction en Qt ? Comment faire ?

    Merci pour vos idées

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour faire cela tu as au moins 2 solutions:
    - La façon Qt: utiliser la fonction connect
    Tu crées un signal dans ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nbrDisquesChanged(int newnbr); // par exemple
    et tu le connectes au slot display de ta variable LCDNombreDisques.
    Dès que tu changeras le nombre de disques, tu 'émettras' ton signal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    emit nbrDisquesChanged(12);  // 12 dans ton cas d'exemple
    - Une façon plus C++:
    Mettre ta variable LCDNombreDisques comme variable de ta classe, dès que ton nombre change, faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LCDNombreDisques->display(newnbrDisques);
    Dernière modification par Deepin ; 22/08/2011 à 09h52.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Merci pour tes réponses. C'est une piste a exploré. Le soucis est le déclenchement du signal (dans la "methode plus C++", de savoir que la variable a changé). J'aurais aimé que ça soit fait quand je reviens sur l'onglet d'accueil. Est ce que ce signal pourrait m'aider ?

    http://qt.developpez.com/doc/latest/...currentchanged

    Avec ça, je dois pouvoir savoir si j'ai sélectionné mon onglet non ? (faut encore faire la correspondance entre l'index et le nom de l'onglet, mais ça devrait le faire...). Je relie ce signal une méthode perso testant l'onglet choisi, si c'est celui d'accueil, hop ! Mise à jour !

    Je testerai ça ce soir ou ce week-end si le temps me manque

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 111
    Par défaut
    salut,
    il faut réexecuter le SELECT COUNT quand c'est l'onglet qui contient LCDNombreDisques qui est affiché. Pour ça il y a le signal
    void QTabWidget::currentChanged ( int index )

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Ça marche ! Merci pour votre aide !


    Pour ceux que ça intéresse, les bouts de code :

    1) Dans le header du widget servant d'onglet d'accueil, on rajoute :
    Code MyWelcomeTab.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Q_OBJECT // pour le slot personnalise Mise a jour LCD
        public slots:
            void majLCDNombreDisques(int);

    2) On crée le slot dans le fichier source associé :
    Code MyWelcomeTab.cpp : 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
     
    void MyWelcomeTab::majLCDNombreDisques(int currentTabIndex)
    {
        qDebug() << "Debut du slot majLCDNombreDisques...";
        qDebug() << currentTabIndex ;
     
        // Si l'onglet courant est l'onglet d'accueil (le premier de la liste)
        if(currentTabIndex == 0)
        {
            // Comptage du nbr de disques
            int nbrDisques = MySQL_elementsCount("elements");
            if(nbrDisques < 0)
            {
                // Erreur lors de la requete sur la base
                QMessageBox::critical(\
                    this,\
                    tr("Erreur SQL"),\
                    tr("Il a ete impossible de compter le nombre d'element dans la base de donnees. Le fonctionnement pourrait s'en trouver corrompu"));
     
            }
            // Mise a jour de l'afficheur LCD
            this->LCDNombreDisques->display(nbrDisques);
        }
        // else : rien
    }//majLCDNombreDisques

    3) Dans le fichier source où on crée l'onglet QTabWidget, on connecte le signal et le slot :
    Code MyMainWindows.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        // Connexion du signal indiquant un changement d'onglet
        QObject::connect(ongletsPrincipaux, SIGNAL(currentChanged(int)), onglet1, SLOT(majLCDNombreDisques(int)));
    avec "ongletsPrincipaux" l'objet QTabWidget et "onglet1" l'objet MyWelcomeTab.

    Je marque comme résolu

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

Discussions similaires

  1. Problème de mise à jour des données sur un onglet
    Par PenPen_lepingouin dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/06/2008, 17h49
  2. [JLabel] Problème de mise à jour du contenu
    Par Traroth2 dans le forum Composants
    Réponses: 9
    Dernier message: 25/06/2008, 11h59
  3. Réponses: 2
    Dernier message: 24/03/2008, 17h59
  4. Réponses: 3
    Dernier message: 19/07/2007, 15h46
  5. Comparaison et mise à jour de contenu
    Par c-ve dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/06/2007, 20h58

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