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

Bases de données Discussion :

QtableView QtableModel et délégué


Sujet :

Bases de données

  1. #1
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut QtableView QtableModel et délégué
    Bonjour,

    Je travaille sur une base de données SQlite. Dans une de mes tables je veux mémoriser une date dans une des colonnes, j'ai donc typé cette colonne en texte. Je souhaite une date sous le format AAAA/MM/DD.

    Pour visualiser et mettre à jour les données j'utilise une QTableView. A l'aide des tutoriels présents ici j'arrive à afficher et mettre à jour mes données même avec une clé étrangère.
    Par contre je souhaiterais utiliser un QDateEdit dans la colonne qui contient la date, pour être sur du format de la date et faciliter la saisie par l'utilisateur.

    Le seul moyen que j'ai trouvé pour cela est de créer un délégué pour gérer la date. Le problème est que pour le mettre en œuvre je suis obligé de passer par la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui->tableViewMoyen->setItemDelegate(new DateDelegate(numcol));
    ce qui court-circuite la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui->tableViewMoyen->setItemDelegate(new QSqlRelationalDelegate(this));
    qui me sert à relier la vue de ma table à ma base de données.

    Quelqu'un a t-il une idée sur la manière de procéder ?

  2. #2
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    J'ai un peu progressé, j'utilise un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui->tableViewMoyen->setItemDelegateForColumn(Moyen_valid, new DateDelegate(Moyen_valid));
    Ceci me permet d'utiliser un DateEdit dans la column concernée par les dates, mais je n'arrives pas à mettre à jours la base de données :

    Voici le code de ma classe déléguée, il faut surement rajouter quelque chose pour faire la mise à jour de la base de données car j'imagine que mon délégué DateDelegate couvre le QSqlRelationalDelegate
    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
    #ifndef DATEDELEGATE_H
    #define DATEDELEGATE_H
     
    #include <QItemDelegate>
     
    class DateDelegate : public QItemDelegate
    {
        Q_OBJECT
     
    public:
        DateDelegate(int durationColumn, QObject *parent=NULL);
     
        QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
        void setEditorData(QWidget *editor, const QModelIndex &index) const;
        void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
     
    private slots:
        void commitAndCloseEditor();
     
    private:
        int durationColumm;
    };
     
    #endif // DATEDELEGATE_H
    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
    #include "datedelegate.h"
    #include <QtGui>
    #include <QString>
    #include <QDate>
     
    DateDelegate::DateDelegate(int durationColumn, QObject *parent) : QItemDelegate(parent)
    {
        this->durationColumm = durationColumn;
    }
     
     
    QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        if (index.column() == durationColumm )
        {
            QDateEdit *dateEdit = new QDateEdit(parent);
            dateEdit->setDisplayFormat("yyyy-MM-dd");
            connect(dateEdit, SIGNAL(editingFinished()),this,SLOT(commitAndCloseEditor()));
            return dateEdit;
        } else {
            return QItemDelegate::createEditor(parent,option,index);
        }
    }
     
    void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        if (index.column() == durationColumm )
        {
            QString DateCourante = index.model()->data(index,Qt::DisplayRole).toString();
            QDateEdit *dateEdit = qobject_cast<QDateEdit*>(editor);
            dateEdit->setDate(QDate::fromString(DateCourante,"yyyy-MM-dd"));
        } else {
            return QItemDelegate::setEditorData(editor,index);
        }
    }
     
    void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        if (index.column() == durationColumm )
        {
            QDateEdit *dateEdit  = qobject_cast<QDateEdit*>(editor);
            QDate date = dateEdit->date();
            QString dateformate = date.toString("yyyy-MM-dd");
            model->setData(index,dateformate);
        } else {
            QItemDelegate::setModelData(editor,model,index);
        }
    }
     
    void DateDelegate::commitAndCloseEditor()
    {
        QDateEdit *editor = qobject_cast<QDateEdit*>(sender());
        emit commitData(editor);
        emit closeEditor(editor);
    }

Discussions similaires

  1. DNS délégué et secondaire
    Par tenderstoune dans le forum Réseau
    Réponses: 0
    Dernier message: 27/04/2008, 03h29
  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