我有子類QAbstractProxyModel和它的源模型是QSqlTableModel的子類。代理模型一次只能顯示一行源模型。下面的代碼:setData返回false爲QAbstractProxyModel
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是一個私有成員保存源模型的當前行。
setData()總是返回false。源模型設置爲手動提交。我究竟做錯了什麼?
編輯:
我想通了這個問題。我使用的源模型是QSqlTableModel的子類,它爲EditRole以外的任何角色調用QSqlQueryModel的setData。由於QSqlQueryModel本身並沒有重新實現setData,所以它調用QAbstractItemModel的setData,它始終返回false。因此,現在我使用EditRole調用所有setData(),data()從EditRole下存儲的源模型返回值。
兩個'setData()'方法中的哪一個返回'false'? 也就是說是代理的方法自己返回「false」還是因爲源代碼模型的方法? –
哪個'false'返回?代理模式中有三個「錯誤」,主模式中有兩個「錯誤」。 – 2017-01-03 10:22:24
主模型和代理模型的所有setData方法都返回false。 sourceModel() - > setData()返回false。 – user2522981