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 :

Branche parallèle de widgets et repaint()

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Branche parallèle de widgets et repaint()
    Bonjour,

    J'ai un souci pour repaint() une QTableView complète, en l'ordonnant depuis l'editorEvent d'un delegate. Traduction :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool MyTableViewDelegate::editorEvent ( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option,
                               const QModelIndex& index ) {
     
        // BLABLABLA
        QTableView* p = qobject_cast< QTableView* > ( parent() );
        p->repaint();
     
        return l_result; // osef
    }

    Ce tableau contient des cases à cocher, avec exclusivité : cocher une case décoche les autres, c'est géré dans le modèle (d'où l'appel du repaint sur toute la table).

    Jusqu'à la modification qui va suivre, ceci fonctionne parfaitement. J'ai des tableaux comme ça dans une fenêtre, parfait.

    J'ai alors eu besoin de créer des widgets "popup", affichés devant tout le monde, et contenant ces mêmes QTableView.
    Je les crée en donnant pour parent QApplication::activeWindow(). C'est pour ça que je parle de branche parallèle, car chaque "popup" est fille du plus haut de la hiérarchie, ceci afin d'apparaitre devant les autres et non d'être clippé par son créateur.

    Problème : le repaint() ne fonctionne plus. Si je coche une case, la case précédemment cochée le reste visiblement. Mais si je clique ailleurs, ou fait n'importe quelle action (appui d'une touche, ...), il y a enfin mise à jour et la case se décoche. En gros l'appel forcé de repaint() est ignoré et ça repaint plus tard, dès la prochaine interaction.

    Une idée ?

  2. #2
    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
    Une solution que j'ai trouvée est de remplacer
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QTableView* p = qobject_cast< QTableView* > ( parent() );
    p->repaint();

    par
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    QTableView* p = qobject_cast< QTableView* > ( parent() );
     
    foreach ( QObject * o, p->children() ) {
        QWidget* w = qobject_cast< QWidget* > ( o );
     
        if ( w != 0 ) {
            w->update();
        }
    }

    M'enfin c'est étrange non ?

  3. #3
    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
    M'enfin c'est étrange non ?
    Oui beaucoup Tu casses complètement l'encapsulation là

    c'est géré dans le modèle (d'où l'appel du repaint sur toute la table).
    C'est à dire ? Cocher une case envoi un signal au model, qui décoche les autres cases ? Dans ce cas, c'est au model de prévenir la vue qu'il a était modifiée et qu'elle doit se mettre à jour (il faut émettre le signal dataChanged)
    A priori, un case (ton delegate) n'a pas à relancer l'update de la vue.


    Concernant l'implémentation de ton delegate, tu n'utilises pas de QCheckBox ?

  4. #4
    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
    Citation Envoyé par gbdivers Voir le message
    C'est à dire ? Cocher une case envoi un signal au model, qui décoche les autres cases ? Dans ce cas, c'est au model de prévenir la vue qu'il a était modifiée et qu'elle doit se mettre à jour (il faut émettre le signal dataChanged)
    A priori, un case (ton delegate) n'a pas à relancer l'update de la vue.
    C'est vrai, jusque là le modèle se met à jour et ensuite on redessine tout le tableau. J'ai essayé du coup d'enlever ça et de faire
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MyTableView::onDataChanged ( const QModelIndex& topLeft, const QModelIndex& )
    {
        update( topLeft );
    }
    et ça marche ! (edit )

    Citation Envoyé par gbdivers Voir le message
    Concernant l'implémentation de ton delegate, tu n'utilises pas de QCheckBox ?
    Non : QApplication::style()->drawControl ( QStyle::CE_CheckBox, &checkboxstyle, painter );C'est de façon à pouvoir styliser facilement, c'est pas moi qui l'ai fait de toute façon.

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/04/2013, 14h10
  2. (eclipse)gestion de plusieurs branches en parallèle
    Par olivier57b dans le forum GIT
    Réponses: 2
    Dernier message: 28/06/2012, 12h23
  3. Gestion du port paralléle sous 2000
    Par kardex dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/01/2006, 19h47
  4. [SWT]Eclipse Java : swt.widgets.Table
    Par watson dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 01/10/2003, 09h07
  5. Port Parallèle EPP ou ECP, hardware vs software ?
    Par TONIAPEL dans le forum Assembleur
    Réponses: 3
    Dernier message: 21/08/2003, 01h39

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