У меня есть subclassed 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, который вызывает setData QSqlQueryModel для любой роли, отличной от EditRole. Поскольку QSqlQueryModel сам по себе не переопределяет setData, он вызывает setData QAbstractItemModel, который всегда возвращает false.
Итак, теперь я делаю все вызовы setData() с помощью EditRole, а data() возвращает значения из исходной модели, хранящейся в EditRole.
Какой метод 'setData()' возвращает 'false'? I.e. является ли метод прокси, возвращающий «ложь» самостоятельно или потому, что меход исходной модели сделал? –
Какой 'false' возвращается? У вас есть три «фальши» в прокси-модели и два в основной модели. –
Все методы setData для основной и прокси-модели возвращают false. sourceModel() -> setData() возвращает false. – user2522981