Problème checkbox avec delegue



  • Bonjour,
    Lorsque j'appelle le delegué ma case à cocher est inactive, alors que sans le delégué ça marche. Merci de votre aide.
    Vioci le code:

    #include "paystablemodel.h"
    #include "delegue.h"
    
    PaysTableModel::PaysTableModel(const QStringList &listePays, QList<int> &listeCases, QObject *parent):QAbstractTableModel(parent)
    
     {if (listePays.count() > 0) this->listePays = listePays;
    if (listeCases.count() > 0) this->listeCases = listeCases;
    
     }
    int PaysTableModel::rowCount(const QModelIndex &parent) const
    { return parent.isValid() ? 0 : this->listePays.count(); }
    //{return 5;}
    int PaysTableModel::columnCount(const QModelIndex &parent) const
    { return parent.isValid() ? 0 : NbColonnes; }
    //{return 2;}
    
    QVariant PaysTableModel::data(const QModelIndex &index, int role) const {
    if (! index.isValid()) return QVariant() ;
    if(((unsigned int)index.row()>=this->listePays.count())||(index.column()>=NbColonnes))
    return QVariant();
    if ((role == Qt::DisplayRole || role == Qt::EditRole)) {
    if(index.column() == Pays) return this->listePays.at(index.row());}
    
    if (role == Qt::CheckStateRole && (index.column() == Cases))
    
       {
             {int checked  = listeCases.at(index.row());
             if (checked)
             {return Qt::Checked;}
             else
             {return Qt::Unchecked;}
             }
     }
     else
    
         {
    return QVariant();
    }
    
    }
    bool PaysTableModel::setData(const QModelIndex &index, const QVariant &value, int role){
         if (index.column() == Cases && role == Qt::CheckStateRole) {
     this->listeCases.replace(index.row(), value.toInt());
      if (index.column() == Cases)
          { emit(dataChanged(index,index));
        return false;}
        }
        return true;
    }
    
    Qt::ItemFlags PaysTableModel::flags(const QModelIndex &index) const {
    
    if (index.column() == Pays) 
    {
    return   Qt::ItemIsEnabled;
    }
    else if (index.column() == Cases) 
    {
    return  Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
    
    }
    return QAbstractTableModel::flags(index);
    }
    
    #include "delegue.h"
    #include "paystablemodel.h"
    
    Delegue::Delegue(QObject *parent) :
        QStyledItemDelegate(parent)
    {
    
    }
    
    QWidget *Delegue::createEditor(QWidget *parent,
        const QStyleOptionViewItem &option,
        const QModelIndex &index ) const
    {
        if (index.column() == 1)
            {
        QCheckBox *editor = new QCheckBox(parent);
     
        return false;
            }
        return QStyledItemDelegate::createEditor(parent, option, index);
    }
    
    
    
    void Delegue::setEditorData(QWidget *editor,
                                         const QModelIndex &index) const
     {
        if (index.column() == 1)
            {
            int value = index.model()->data(index, Qt::DisplayRole).toInt();
             QCheckBox *checkBox = static_cast<QCheckBox*>(editor);
            if(value == 1) {
                    checkBox->setCheckState(Qt::Checked);
             } else {
                    checkBox->setCheckState(Qt::Unchecked);
                    }
        }
        else
            {
                QStyledItemDelegate::setEditorData(editor, index);
            }
     }
    
    
    
    void Delegue::setModelData(QWidget *editor, QAbstractItemModel *model,
                                        const QModelIndex &index) const
     {
        if (index.column() == 1)
            {
                QCheckBox *checkBox = static_cast<QCheckBox*>(editor);
                int value;
                if(checkBox->checkState() == Qt::Checked)
                    value = 1;
                else
                    value = 0;
                model->setData(index, value);
        }
        else
            {
                QStyledItemDelegate::setModelData(editor, model, index);
            }
     }
    
    
    void Delegue::updateEditorGeometry(QWidget *editor,
         const QStyleOptionViewItem &option, const QModelIndex &index) const
     {
        Q_UNUSED(index);
        editor->setGeometry(option.rect);
     }
    
    
    void Delegue::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        if (index.column() == 1)
        {
            int value = index.model()->data(index, Qt::DisplayRole).toInt();
            QStyleOptionButton check_box;
            check_box.state = QStyle::State_Enabled;
            check_box.rect = option.rect;
            if (value == 1) {
                check_box.state = QStyle::State_On|QStyle::State_Enabled;;
            }
            else {
                check_box.state = QStyle::State_Off|QStyle::State_Enabled;;
            }
          QApplication::style()->drawControl(QStyle::CE_CheckBox, &check_box, painter);
        }
        else
            {
                QStyledItemDelegate::paint(painter, option, index);
            }
    }
    
    
    
    #include "essai0.h"
    #include "ui_essai0.h"
    
    essai0::essai0(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::essai0)
    {
        ui->setupUi(this);
    
        listeP << "France" << "Angleterre" << "Espagne" << "Italie" << "Allemagne";
        listeC << 1 << 0 << 0 << 0 << 1;
    
            PaysTableModel *modele = new PaysTableModel(listeP, listeC);
            Delegue *mydelegue = new Delegue();
            ui->tableView->setModel(modele);
      //  ui->tableView->setItemDelegate(mydelegue);
    
       }
    
    essai0::~essai0()
    {
        delete ui;
    }
    

 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.