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 :

Onglets


Sujet :

Qt

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut Onglets
    Bonjour à vous tous.

    Dans un mini projet de navigateur web, il est, pour moi, indispensable d'avoir une navigation par onglet ^^.

    Seulement voilà, il existe un problème lors de la fermeture de ces dits onglets. La libération de la mémoire, le fait que Qt libère elle même la mémoire me trouble, et je ne comprends pas comment elle fait pour savoir si c'est de la mémoire dynamique ou non surtout...

    Bref, j'organise mon onglet comme ceci personnellement : Un QWidget pour chaque onglet. Ce Widget contient un layout contenant tout les autres widget.

    Les 3 sont alloué de manière dynamique.

    Ma libération se fait comme ceci, seulement, lorsque je "delete" le widget, je remarque que l'onglet se ferme tout seul ^^.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Window::closeOnglet(int index)
    {
        delete onglets.widget(index)->findChild<QWebView *>();
        delete onglets.widget(index)->layout();
        delete onglets.widget(index);
     
        if(onglets.count() == 1)
            onglets.setTabsClosable(false);
    }
    Qu'en pensez vous? Est ce bien? Ou faut il utilisé la fonction adéquate?

    Merci à vous.

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    La gestion de la mémoire est en fait assez simple. Dans Qt tout objet a potentiellement un parent (passé en argument du constructeur), lorsqu'un objet est détruit il va détruire tous ses enfants.
    Donc le QWidget représentant un onglet détruira l'ensemble des objets contenus par l'onglet, si on leur donne en tant que parent ce même QWidget. Il n'y a que les allocations dynamiques qui ont besoin d'être libérées, les statiques c'est automatiquement géré dés la compilation.

    Pour les onglets j'imagine que tu utilises QTabWidget ? La doc donne des détails et des exemples :
    http://qt.developpez.com/doc/4.7/qtabwidget/#details
    En particulier le signal lorsque l'utilisateur veut fermer un onglet tabcloserequested, c'est celui que tu utilises avec le code donné je suppose ?
    Il me semble normal que l'onglet se ferme tout seul, le signal t'indique que l'utilisateur veut fermer l'onglet, et Qt va fermer l'onglet automatiquement.

    Tu n'as pas besoin des lignes 4 et 5, si tu déclares bien tes éléments en tant qu'enfants du QWidget que tu supprimes.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut
    Avant, pour fermé un onglet, j'utilisais tabRemove en utilisant le signal pour récupérer l'index ^^.

    Par contre je comprends pas, si je les alloue avec new, même si ils sont parents, pourquoi ne devrais je pas utilisé delete? C'est ça qui me trouble en fait ^^.

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Un "parent" appelle automatiquement delete sur ses enfants lorsqu'il est détruit, donc ce n'est pas la peine de le faire soi même.

    Concernant l'onglet je suppose que lorsqu'on détruit le widget associé Qt le ferme automatiquement puisqu'il n'a plus aucun contenu. Je ne pense pas que ça soit un problème, si jamais ça l'était tu peux toujours récupérer le pointeur du QWidget dans une variable temporaire, fermer l'onglet comme tu le souhaites et appeler delete sur le pointeur ensuite.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut
    Oui, c'est bien ce que je dis, c'est ça qui me trouble : les delete automatique, enfin je suppose que c'est une habitude à prendre .

    Merci de ton aide.

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

Discussions similaires

  1. Fiche à Onglets: Rendre inactif un TTabSheet
    Par Akta3d dans le forum C++Builder
    Réponses: 7
    Dernier message: 21/04/2004, 14h40
  2. [VB.NET] Couleurs des onglets d'un TabControl
    Par ineznia dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/04/2004, 13h18
  3. mettre une JScrollBar sur un onglet
    Par thedd dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 02/03/2004, 20h12
  4. [BCB6] Probleme onglet dans IDE
    Par bgautier dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/01/2004, 16h20
  5. Changer dynamiquement la position des onglets
    Par ginnovy dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/09/2002, 18h24

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