QTableView and unique IDs

QTableView and unique IDs

本文关键字:IDs unique and QTableView      更新时间:2023-10-16

我是Qt新手,来自c# . net。我试图复制一个相当简单的程序,我写在c# Qt作为学习工具。我有一个继承QAbstractTableModel并实现的数据模型:

rowCount,columnCount,数据,setData,headerData旗帜

我的数据结构是一个map

std::map<int, CBDataRow>

所以我们的想法是,每一行都有一个唯一的int ID和一个包含其余行信息的结构体。

我现在卡住的是如何更新我的数据模型,当用户在QTableView对象进行编辑。setData函数会被调用。

bool CBDatabaseModel::setData(const QModelIndex &index, const QVariant &value, int role) {
    bool success = false;
    if(role == Qt::EditRole) {
        success = m_data.UpdateRow(index, value);
    }
    if(success) {
        emit dataChanged(index, index);
        return true;
    } else {
        return false;
    }
}

现在可以看到,UpdateRow()函数在编辑时被调用。该函数应该在映射中找到唯一的id,并更新其CBDataRow结构的适当成员。我的问题是,我不知道如何从传递到编辑函数的QModelIndex对象中获得唯一ID。

例如

:用户编辑第3行"CB Name"单元格。第三行数据的唯一ID为100。这个值100在QTableView的隐藏列中,列索引为0。所以我需要做的很简单:推出(伪代码)

it = m_data.find(unique_id);
it->second.cb_name = value.toString();

由于用户正在编辑列1,我如何找到列0中包含的唯一ID ?

我建议重新实现模型的index()方法,并通过使用调用createIndex(row,col, unique_id);

然后在你得到QModelIndex的任何地方,你总是可以提取unique_id = model_index.internalId();

在我看来,您可以将数据存储在数组中,并通过index.row()简单地访问您的元素索引:

QVector<CBDataRow> m_data;
....
bool CBDatabaseModel::setData(const QModelIndex &index, const QVariant &value, int role) {
    bool success = false;
    if(role == Qt::EditRole && index.row() < m_data.size()) {
        success = m_data.at(index.row()).UpdateRow(index.column(), value);
    }
    if(success) {
        emit dataChanged(index, index);
        return true;
    } else {
        return false;
    }
}

如果你担心元素排序,你可以从QSortFilterProxyModel(而不是QAbstractTableModel)派生你的模型,然后重新实现

bool CBDatabaseModel::lessThan(const QModelIndex &left,
                                   const QModelIndex &right) const

不需要自己定义内部id。我希望这对你有帮助。