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 :

Utilisation d'un widget pour personnaliser un QTableView


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut Utilisation d'un widget pour personnaliser un QTableView
    Bonjour à tous,

    J'aurai besoin de personnaliser un QTableView en utilisant un widget créé moi-même (contenant 4 QLabel mise en forme) dans une colonne.

    J'initialise donc un Delegate pour mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            m_ui.setupUi(this);
     
            m_model = new QPluginsTableModel(fmk);
     
            m_ui.pluginTableView->setModel(m_model);
     
            QPluginItemDelegate *pWidget = new QPluginItemDelegate(this);
            m_ui.pluginTableView->setItemDelegateForColumn(0, pWidget);
    Et dans mon Delegate, je redéfinie la fonction paint pour pouvoir dessiner mon widget. Je le fait de la manière suivante mais je pense que je me trompe :
    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
        QPluginItemDelegate::QPluginItemDelegate(QObject *parent)
            :QStyledItemDelegate (parent)
        {
            cout << "QPluginItemDelegate::QPluginItemDelegate" << endl;
        }
     
        QPluginItemDelegate::~QPluginItemDelegate()
        {
            cout << "QPluginItemDelegate::~QPluginItemDelegate" << endl;
        }
     
        void QPluginItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                   const QModelIndex &index) const
        {
            cout << "QPluginItemDelegate::paint " << index.column() << endl;
     
            if (index.column() == 0) {
     
                QVariant variant = index.data(Qt::UserRole);
                QHash<QString, QString> headers = variant.value<QHash<QString, QString> >();
                QPluginItemWidget item(headers); //le cout du CTor s'affiche correctement
     
     
                QStyleOptionComplex complex;
                complex.init(&item);
                complex.rect = option.rect;
     
                complex.state = QStyle::State_Enabled;
                complex.direction = QApplication::layoutDirection();
                complex.rect = option.rect;
                complex.fontMetrics = QApplication::fontMetrics();
     
                cout << "QPluginItemDelegate::paint " << headers.value("Name").toStdString() << endl;
     
                QApplication::style()->drawControl(QStyle::CE_CustomBase,
                                                   &complex, painter);
     
            } else
                QStyledItemDelegate::paint(painter, option, index);
        }
    Mais à l'éxecution, la case de mon tableau apparait vide. Je pense que le problème vient de l'utilisation de QStyleOptionComplex car quand j'utilise un QStyleOptionProgressBar comme dans "l'exemple Qt" le progressBar apparait correctement.

    Sauriez-vous ce que je fais mal et comment je pourrai faire apparaitre mon widget dans la cellule de mon tableau ?

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    J'ai essayé de remplacer toute la partie du QStyleOptionComplex par

    mais malheureusement, le résultat est identique : la cellule est vide.

  3. #3
    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
    Bonsoir,

    Ceci devrait vous intéresser :

    http://qt.developpez.com/faq/?page=m...view-delegates

    Bonne continuation,
    Amnell.
    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

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    Merci Amnell. Comme je l'ai indiqué, j'ai déjà intégré l'exemple Qt utilisant un QStyleOptionProgressBar et ca fonctionne très bien. Dans mon cas, je n'ai pas un objet "de base" (style SpinBox, ComboBox, ProgressBar ... ) mais un widget que j'ai créé moi même avec QDesigner (grosso modo un widget ayant 4 QLabel à l’intérieur).

    Donc dans mon cas, dans l'implémentation de la méthode paint() de mon Delegate dois-je :
    - utiliser un QStyleOptionComplex comme écrit dans mon code et à ce moment là, quelle est mon erreur ?
    - passer le painter à la méthode render() de mon widget ? J'ai essayé mais sans résultat.
    - implémenter la méthode paint() d'une autre manière mais laquelle ?

    Merci de votre aide.

  5. #5
    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,

    Et si vous remplacez par ceci :

    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 QPluginItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                   const QModelIndex &index) const
        {
            cout << "QPluginItemDelegate::paint " << index.column() << endl;
     
            if (index.column() == 0) {
                QVariant variant = index.data(Qt::UserRole);
                QHash<QString, QString> headers = variant.value<QHash<QString, QString> >();
                QPluginItemWidget item(headers);
                item.resize(option.rect().size());
     
                QPixmap pixmap(item.size());
                item.render(&pixmap);
     
                painter->drawPixmap(option.rect(), pixmap);
            } else
                QStyledItemDelegate::paint(painter, option, index);
        }
    Quel est le résultat ? Le problème est que le destructeur doit également être appelé vu que votre item est une variable, donc si vous avez un rendu avec cela, il sera statique dans le sens où vous ne pourrez probablement pas interagir avec votre élément.

    Bonne continuation,
    Amnell.
    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

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    Merci Amnell, votre code me permet d'afficher une partie de mon widget car il est plus haut que la hauteur de la cellule.

    Je vais faire une classe TableView perso hérité de QTableView pour essayer de gérer cela.

    Je passerai en résolu quand j'aurai réussi à faire rédimensionner la cellule selon la taille de mon widget (et je mettrai la solution ici dans le cas où quelqu'un est le même problème dans le futur)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    Je viens de passer ce problème en . Merci beaucoup Amnell pour ton aide.

    Pour le redimensionnement de la taille de mes cellules, j'ai juste eu à faire un resizeColumnToContents(int)/resizeRowToContents(int) sur chacune de mes lignes et colonnes à la fin de mon remplissage. (les méthodes automatiques resizeColumnsToContents()/ resizeColumnsToContents() faisant nimp )

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

Discussions similaires

  1. [Débutant] Utilisation de l'API Windows pour personnaliser des contrôles
    Par noftal dans le forum VB.NET
    Réponses: 10
    Dernier message: 12/11/2013, 23h21
  2. Réponses: 2
    Dernier message: 17/02/2009, 20h26
  3. Utiliser le port parallele pour simuler un digicode
    Par nonoRedDevils dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/12/2003, 13h23
  4. utilisation d'objets ADO pour CMS sur POSTGRESQL7.3.2
    Par turbok dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/10/2003, 09h29

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