如果
source code
修改后,问题被理解为:
bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
// ...
if (!(flags(index) & Qt::ItemIsEditable))
return false;
// ...
}
可以看出,如果QModelIndex不可编辑,那么setData将不执行任何操作,并像本例中那样返回false。
因此,解决方案是启用编辑,但我猜您不希望该列可编辑,因此我们将放置一个不允许编辑的代理,而不是使用标志:
Qt::ItemFlags ModelOperators::flags(const QModelIndex &index) const
{
switch (index.column())
{
case MODEL_OPERATORS_COL_NAME: return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
case MODEL_OPERATORS_COL_SIGNATURE: return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
default: return Qt::NoItemFlags;
}
}
class ReadOnlyDelegate: public QStyledItemDelegate
{
public:
using QStyledItemDelegate::QStyledItemDelegate;
QWidget *createEditor(QWidget */*parent*/, const QStyleOptionViewItem & /*option*/, const QModelIndex &/*index*/) const override
{
return nullptr;
}
};
_modelOperators = new ModelOperators(this, QSqlDatabase::database("dbApp"));
ui->tableOperators->setModel(_modelOperators);
ui->tableOperators->hideColumn(MODEL_OPERATORS_COL_ID);
ui->tableOperators->sortByColumn(MODEL_OPERATORS_COL_NAME);
ui->tableOperators->setItemDelegate(&_delegateOperators);
ReadOnlyDelegate *delegate = new ReadOnlyDelegate(ui->tableOperators);
ui->tableOperators->setItemDelegateForColumn(MODEL_OPERATORS_COL_SIGNATURE, delegate);