我是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?
答案 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。 我希望这可以帮到你。