QTableView和唯一ID

时间:2014-03-19 21:27:24

标签: c++ qt qtableview

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

rowCount时, 信息columnCount, 数据, 使用setData, headerData 标志

我的数据结构是地图

std::map<int, CBDataRow>

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

我现在坚持的是当用户在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。

例如: 用户编辑&#34; CB名称&#34;第3行中的数据具有100的唯一ID。该值100在QTableView的隐藏列中,列索引为0.所以我需要做的只是: (Psuedo代码)

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

在我看来,您可以将数据存储在一个数组中,并通过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。 我希望这可以帮到你。