对于bool列,QSqlTableModel :: setData()始终返回false

时间:2011-05-31 05:02:39

标签: qt qt4

我正在尝试将 true false 值替换为QSqlTableModel中带有 bool 类型的数据库列的复选框。

以下代码似乎有效。 QSqlTableModel :: setData()会将数据发布到后端,并为 bool 列以外的列返回 true

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

选中该复选框后,数据库日志不会显示更新 bool 列的SQL。如果我是对的,这表示问题出在我的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);

1 个答案:

答案 0 :(得分:0)

调用bool r= QSqlTableModel::setData(idx,v,role);而不是传递角色时,请尝试使用 Qt :: EditRole 进行调用,如下所示。

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

我没有尝试过,但我想这应该会有效。