与QSqlTableModel ::使用setData()始终返回布尔列

问题描述:

假我试图与复选框在与QSqlTableModel与布尔类型更换真正值的数据库列。与QSqlTableModel ::使用setData()始终返回布尔列

下面的代码似乎是工作。 QSqlTableModel :: setData()确实将数据发布到后端,并且返回true列以外的其他列bool列。

我遇到的问题是QSqlTableModel :: setData()始终返回false复选框字段。

选中该复选框后,数据库日志不会显示SQL更新bool列。这,如果我是对的,表示问题出在我的Qt代码中,而不是在表中,列或数据库中的数据类型。

帮助将不胜感激。

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

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; 
} 

编辑策略:

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

当调用bool r= QSqlTableModel::setData(idx,v,role);,而不是通过角色尝试Qt的呼唤: :EditRole如下。

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

我还没有尝试过,但我想这应该使它工作。