QSqlTableModel::setData() всегда возвращает false для столбца bool

#qt #qt4

#qt #qt4

Вопрос:

Я пытаюсь заменить значения true и false флажками в QSqlTableModel для столбца базы данных с типом bool.

Следующий код, похоже, работает. QSqlTableModel::setData() отправляет данные на серверную часть и возвращает true для столбцов, отличных от столбца bool.

Проблема, с которой я сталкиваюсь, заключается в том, что QSqlTableModel::setData() всегда возвращает false для поля checkbox.

После установки флажка в журнале базы данных не отображается SQL, обновляющий столбец bool. Это, если я прав, указывает на то, что проблема в моем коде Qt, не в таблице, столбце или типе данных в базе данных.

Помощь будет высоко оценена.

//————-

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

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

Qt::ItemFlags CheckboxTableModel::flags(const QModelIndexamp; 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 QModelIndexamp; idx,const QVariantamp; value,int role)
{
    if(idx.row() < 0 || idx.row() >= rowCount() || idx.column() < 0 || idx.column() >= columnCount())
        return false;
    QVariant v;
    if(role == Qt::CheckStateRole amp;amp; 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:

При вызове bool r= QSqlTableModel::setData(idx,v,role); вместо передачи роли попробуйте вызвать с помощью Qt::EditRole, как показано ниже.

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

Я не пробовал это, но я предполагаю, что это должно заставить его работать.