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 :

QTableView et délégué


Sujet :

Qt

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut QTableView et délégué
    Bonjour à tous,

    Je suis en train de personnaliser l'affichage d'une QTableView en utilisant des QStyledItemDelegate.

    Mon but est d'afficher une liste de 3 doubles (coordonnées 3D d'un point) de la manière suivante:
    • ( x, y, z ) en mode visualisation
    • ( QDoubleSpinBox(x), QDoubleSpinBox(y), QDoubleSpinBox(z) ) en mode édition


    En pratique j'arrive à peu prêt à avoir ce comportement, seulement, le contenu n'est pas adapté à la taille de la colonne:
    Nom : Capture d’écran 2018-11-12 à 10.38.53.png
Affichages : 201
Taille : 64,6 Ko

    Je me doute que le problème vient du sizeHint mais je ne vois pas comment corriger ce problème.

    Voici la méthode paint de mon delegate:

    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
    void Point3DDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option,
    							const QModelIndex & index) const
    {
    	if (index.data().canConvert<Point3DLabel>()) // Classe contenant 3 double et un QString
    	{
                    if (option.state & QStyle::State_Selected)
    		{
    			painter->fillRect(option.rect, option.palette.highlight());
    		}
     
    		painter->save();
     
    		painter->setRenderHint(QPainter::Antialiasing, true);
     
                    QRect rect = option.rect;
    		Point3DLabel label = qvariant_cast<Point3DLabel>(index.data());
    		int yOffset = (rect.height() +20) / 2;
    		painter->translate(rect.x(), rect.y() + yOffset);
    		painter->drawText(0, 0, label.text());
     
    		painter->restore();
    	}
    	else
    	{
    		QStyledItemDelegate::paint(painter, option, index);
    	}
    }
    Pour la méthode sizeHint, je ne suis pas sûr de quoi mettre: pour le moment, j'ai mis la taille d'un caractère et le multiplier par le nombre de caractère dans le QString associé au Point3DLabel. Cependant, ça ne semble pas fonctionner.

    Quelqu'un a une idée et me dire ce que je fais mal?

    Merci.

    PS: J'avais une autre idée qui me plait beaucoup moins: sauvegarder dans mon model seulement un QString et "parser" celui ci quand je souhaite éditer le point, faire des calculs, etc...

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

    Réimplémenter la fonction membre paint() est un peu overkill. Opte plutôt pour displayText() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Point3DDelegate : public QStyledItemDelegate {
    public:
        ...
        QString displayText(const QVariant & value, const QLocale &) const override {
            return value.value<Point3DLabel>().text();
        }
    };
    en visant la bonne colonne avec setItemDelegateForColumn.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Effectivement c'est drôlement plus simple!

    Merci beaucoup

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

Discussions similaires

  1. QtableView QtableModel et délégué
    Par AF_2.8 dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/12/2012, 14h09
  2. évènement/délégué c++ managé/non managé
    Par melleb dans le forum C++
    Réponses: 3
    Dernier message: 31/01/2008, 09h48
  3. Un délégué objet
    Par amazircool dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 09/12/2007, 11h53
  4. [C#][ASP 2.0] délégué
    Par thallak dans le forum ASP.NET
    Réponses: 1
    Dernier message: 10/08/2007, 13h06
  5. Réponses: 2
    Dernier message: 13/12/2006, 18h38

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