2011-05-31 3 views
0

Je suis en train de remplacer vrai et faux valeurs avec cases à cocher QSqlTableModel pour une colonne de base de données avec le type bool .QSqlTableModel :: setData() renvoie toujours false pour la colonne bool

Le code suivant semble fonctionner. QSqlTableModel :: setData() publie les données en backend et renvoie true pour les colonnes autres que la colonne bool.

Le problème que je rencontre est que QSqlTableModel :: setData() renvoie toujours false pour le champ case à cocher.

Après avoir coché la case, le journal de la base de données n'affiche pas l'instruction SQL mettant à jour la colonne bool. Cela, si j'ai raison, indique que le problème est dans mon code Qt, pas dans la table, la colonne ou le type de données dans la base de données.

Les aides seront très appréciées.

// -------------

class CheckboxTableModel : public QSqlTableModel 
{ 
public: 
    CheckboxTableModel(QObject * parent=0,QSqlDatabase db=QSqlDatabase()); 
    QVariant data(const QModelIndex& idx, int role) const; 
    Qt::ItemFlags flags(const QModelIndex&) const; 
    bool setData(const QModelIndex& idx, const QVariant&, int); 
}; 
//------------- 
CheckboxTableModel::CheckboxTableModel(QObject *parent,QSqlDatabase db) 
    : QSqlTableModel(parent,db) 
{ 
} 
//------------- 
#define BOOLEAN_COLUMN_INDEX 7 //index of the boolean field 

QVariant CheckboxTableModel::data(const QModelIndex& idx,int role) const 
{ 
    QVariant v=QSqlTableModel::data(idx,role); 
    if(idx.column() == BOOLEAN_COLUMN_INDEX && (role == Qt::CheckStateRole || role == Qt::EditRole)) 
     return v.toBool() ? Qt::Checked : Qt::Unchecked; 
    else 
     return v; 
} 

Qt::ItemFlags CheckboxTableModel::flags(const QModelIndex& idx) const 
{ 
    if(idx.row() < 0 || idx.row() >= rowCount() || idx.column() < 0 || idx.column() >= columnCount()) 
     return 0; 
    if(idx.column() == BOOLEAN_COLUMN_INDEX) 
     return Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsEnabled; 
    return Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled; 
} 

bool CheckboxTableModel::setData(const QModelIndex& idx,const QVariant& value,int role) 
{ 
    if(idx.row() < 0 || idx.row() >= rowCount() || idx.column() < 0 || idx.column() >= columnCount()) 
     return false; 
    QVariant v; 
    if(role == Qt::CheckStateRole && idx.column() == BOOLEAN_COLUMN_INDEX) 
     v = value.toInt() == Qt::Checked ? true : false; 
    else 
     v=value; 
    bool r= QSqlTableModel::setData(idx,v,role); 
qDebug() << (r ? "Y":"N"); //Always returns "false" for checkbox column. Why? How do I fix this? 
    return r; 
} 

stratégie d'édition:

CheckboxTableModel *model=new CheckboxTableModel(this); 
model->setEditStrategy(QSqlTableModel::OnFieldChange); 

Répondre

0

Lorsque vous appelez bool r= QSqlTableModel::setData(idx,v,role); au lieu de passer le rôle essayer d'appeler avec Qt: : EditRole comme ci-dessous.

bool r= QSqlTableModel::setData(idx,v,Qt::EditRole); 

Je ne l'ai pas essayé mais je suppose que cela devrait le faire fonctionner.

Questions connexes