1

QAbstractProxyModel をサブクラス化し、そのソース モデルは QSqlTableModel のサブクラスです。プロキシ モデルは、一度にソース モデルの 1 つの行のみを表示する必要があります。コードは次のとおりです。

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 を呼び出します。

そのため、すべての setData() 呼び出しを EditRole で行い、data() は EditRole に格納されているソース モデルから値を返します。

4

1 に答える 1