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 :

Actualisation d'un onglet de QTabWidget

  1. #1
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut Actualisation d'un onglet de QTabWidget
    Bonjour

    Je travaille sur un QTabWidget dont le premier onglet doit se "mettre à jour" a chaque fois qu'il est affiché. Plus exactement, cet onglet affiche un nombre aléatoire de label en liste, et après certains traitement de l'utilisateur, quand celui ci reviens sur cet onglet, celui ci doit afficher les modifications.

    Mon soucis et l'actualisation ne se fait pas.

    J'ai donc créé un slot perso sur ma classe qui à pour mission de passer les nouvelles informations à l'onglet et de l'actualiser. J'ai abonner mon slot au signal currentChanged(int) de mon tab.

    Mon evenement se leve bien est éxécute bien les deux lignes de codes. Mais l'interface ne s'actualise pas.

    Voici mon 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
    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
    QLayout* MainWindow::tabGeneral()
    {
        QGridLayout* grid = new QGridLayout;
     
        QLabel* lab = new QLabel;
        lab->setText("Le chateau de xxx");
     
        QScrollArea* area = new QScrollArea;
     
        QWidget* w = new QWidget;
     
        QVBoxLayout* box = new QVBoxLayout;
     
        for(int i = 1; i < 21; i++)
        {
            QLabel* labScen = new QLabel;
            labScen->setText(QString::number(i) + " : Scénario x");
            box->addWidget(labScen);
        }
     
        w->setLayout(box);
     
        area->setWidget(w);
     
        QStringList calcs;
        ImageChateau* image = new ImageChateau(this, "/home/anthony/Projets_Qt/test.png", calcs);
     
     
        grid->addWidget(lab, 0, 0, 1, 2, Qt::AlignCenter);
        grid->addWidget(area, 1, 1);
        grid->addWidget(image, 1, 0);
     
        return grid;
    }
     
    void MainWindow::changeOnglet(int i)
    {
        if (i == 0)
        {
            tab->widget(0)->setLayout(tabGeneral2());
            tab->update();
        }
    }
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        tab = new QTabWidget(this);
        tab->setGeometry(30,20,240,160);
     
        QWidget* general = new QWidget;
     
        general->setLayout(tabGeneral());
     
        tab->addTab(general, "Général");
     
        connect(tab, SIGNAL(currentChanged(int)), this, SLOT(changeOnglet(int)));
    }
    La méthode tabGeneral2 est une copie de tabGeneral sauf qu'elle fait un tour de boucle de plus (juste pour tester l'actualisation).

    Je vous remercie d'avance.
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  2. #2
    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
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Le problème qui se pose est que vous tentez de remplacer le layout d'un QWidget avec un nouveau layout, ce qui n'est pas possible. Une solution à votre problème serait de vider le QGridLayout créé et de le garnir de nouveau plutôt que de le recréer et de tout écraser. Par exemple :

    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
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        tab = new QTabWidget(this);
        tab->setGeometry(30,20,240,160);
     
        QWidget* general = new QWidget;
     
        setTabGeneral(general);
     
        tab->addTab(general, "Général");
        tab->addTab(new QWidget, "Test");
     
        connect(tab, SIGNAL(currentChanged(int)), this, SLOT(changeOnglet(int)));
    }
     
    MainWindow::~MainWindow()
    {
    }
     
    void MainWindow::setTabGeneral(QWidget *dest)
    {
        QGridLayout* grid = qobject_cast<QGridLayout *>(dest->layout());
     
        if (!grid)
        {
            grid = new QGridLayout;
            dest->setLayout(grid);
        }
     
        for (int count = grid->count(); count > 0; count = grid->count())
            grid->removeItem(grid->itemAt(0));
     
        QLabel* lab = new QLabel;
        lab->setText("Le chateau de xxx");
     
        // ...
        // etc.
        // ...
     
        grid->addWidget(lab, 0, 0, 1, 2, Qt::AlignCenter);
        grid->addWidget(area, 1, 1);
        grid->addWidget(image, 1, 0);
    }
     
    void MainWindow::changeOnglet(int i)
    {
        if (i == 0)
            setTabGeneral(tab->widget(0));
    }
    Attention cependant aux fuites de mémoire : tout objet créé se doit d'être détruit. Dans le cas du removeItem(), il faudra ensuite appeler deleteLater() sur l'objet retiré pour bien le détruire. En théorie, par parenté, cela devrait être suffisant pour détruire correctement toute l'arborescence écrasée par le nouvel appel à setTabGeneral().

    Bonne journée,
    Louis
    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

  3. #3
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Bonjours,

    Merci pour l'explication, effectivement cela marche mieux ainsi.

    J’étais pas partie sur la bonne logique en souhaitant changer le layout et actualiser l'affichage.

    Mon problème est résolue.

    Passez une bonne journée.
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

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

Discussions similaires

  1. [XL-2007] derniere actualisation d'un onglet ?
    Par EFFLYINGJOKER dans le forum Excel
    Réponses: 1
    Dernier message: 13/01/2010, 15h50
  2. Réponses: 5
    Dernier message: 27/10/2009, 16h46
  3. Ajouter un onglet dans QTabWidget
    Par Invité dans le forum Qt
    Réponses: 6
    Dernier message: 26/02/2008, 15h46
  4. Réponses: 2
    Dernier message: 27/08/2007, 17h53
  5. Réponses: 5
    Dernier message: 09/09/2006, 21h30

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