私はサブクラス化されたQAbstractProxyModelを持ち、そのソースモデルはQSqlTableModelのサブクラスです。プロキシモデルは、一度にソースモデルの行を1つだけ表示する必要があります。QAbstractProxyModelのsetDataはfalseを返します
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を再実装しないため、常にfalseを返すQAbstractItemModelのsetDataを呼び出します。
これで、EditRoleですべてのsetData()呼び出しを行い、data()はEditRoleの下に保存されたソースモデルから値を返します。
2つの 'setData()'メソッドのどれが 'false'を返しますか? I.それ自身で 'false'を返すプロキシのメソッドか、ソースモデルのメードが行ったものなのでしょうか? –
'false'が返されますか?プロキシモデルには3つの「偽り」があり、メインモデルには2つあります。 –
メインモデルとプロキシモデルのすべてのsetDataメソッドはfalseを返します。 sourceModel() - > setData()はfalseを返します。 – user2522981