我已经将QAbstractProxyModel子类化,其源模型是QSqlTableModel的子类。代理模型必须一次仅显示源模型的一行。这是代码:
bool SensorDisplayModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(!index.isValid())
return false;
QModelIndex sourceIdx = mapToSource(index);
if(role == Qt::DisplayRole || role == Qt::EditRole)
{
if(sourceIdx.isValid())
{
if(sourceModel()->setData(sourceIdx, value, role))
{
// emit dataChanged(index, index);
return true;
}
return false;
}
else
return false;
}
return false;
}
源模型:
bool SensorModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(!index.isValid())
return false;
if(role == Qt::EditRole || role == Qt::DisplayRole)
{
if(index.column() != 0)
return QSqlTableModel::setData(index, value, Qt::EditRole) &&
QSqlTableModel::setData(index, value, Qt::DisplayRole);
else
return QSqlTableModel::setData(index, value, role);
}
return false;
}
当必须在源模型中添加新行时,将调用以下命令:
void SensorDisplayModel::addSensor()
{
QString ro_id;
bool success = false;
if(sensorModel->insertRows(sensorModel->rowCount(), 1))
{
selectedRow = sensorModel->rowCount() - 1;
ro_id = "DB-" + QString("%1").arg(SensorDisplayModel::id_no,
3, 10, QChar('0'));
comboBoxItems.append(ro_id);
success = setData(createIndex(0, 0), QVariant(comboBoxItems), Qt::EditRole);
success &= setData(createIndex(0, 0), QVariant(ro_id), Qt::DisplayRole);
SensorDisplayModel::id_no++;
success &= setData(createIndex(0, 1), QVariant(QString("Name")));
success &= setData(createIndex(0, 2), QVariant(-1));
success &= setData(createIndex(0, 3), QVariant(-1));
success &= setData(createIndex(0, 4), QVariant((long long)0));
success &= setData(createIndex(0, 5), QVariant(QString("??")));
success &= setData(createIndex(0, 6), QVariant(QString("??")));
if(success)
emit dataChanged(createIndex(0, 0), createIndex(0, columnCount() - 1));
ID2Row[data(createIndex(0, 0)).toString()] = selectedRow;
}
}
selectedRow是一个私有(private)成员,用于保存源模型的当前行。
setData()始终返回false。源模型设置为手动提交。我究竟做错了什么?
编辑:
我解决了这个问题。我使用的源模型是QSqlTableModel的子类,它为EditRole以外的任何角色调用QSqlQueryModel的setData。由于QSqlQueryModel本身不会重新实现setData,因此它将调用QAbstractItemModel的setData,该方法始终返回false。
因此,我现在使用EditRole进行所有setData()调用,并且data()从存储在EditRole下的源模型返回值。
最佳答案
在这里,您仅设置EditRole
和DisplayRole
的数据。其他角色(例如ForegroundRole
)未设置,因为您返回false。显然,您不需要对这两个模型都进行子类化,因为您的代码除了标准类之外没有做任何其他事情。如果要稍后添加一些代码,至少将第一个块中的最后一个return false
更改为
return QAbstractProxyModel::setData(index,value,role);
在第二个块中最后一个
return false
return QSqlTableModel::setData(index,value,role);
此外,这:
if(index.column() != 0)
return QSqlTableModel::setData(index, value, Qt::EditRole) &&
QSqlTableModel::setData(index, value, Qt::DisplayRole);
else
return QSqlTableModel::setData(index, value, role);
没有任何意义
关于c++ - setData为QAbstractProxyModel返回false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41440606/