QTableView and unique IDs
QTableView and unique IDs
我是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。我希望这对你有帮助。
- 为什么 std::unique 不调用 std::sort?
- 生成"unique"矩阵
- 我对 std::unique(算法)C++有问题
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- C++ 如何生成 10,000 个 UNIQUE 随机整数以存储在 BST 中?
- C++:'unique vector'数据结构
- 为什么 [std::unique] 不能应用于 [std::multiset]?
- 使用 std::unique 和 vector.erase 删除除最后一次出现的重复元素之外的所有元素
- 是否可以在 std::unique<T[ ]> 上应用 std::sort?
- 使用C++代码在Windows Phone 8.1中获取Unique DeviceId
- unique()似乎正在添加最后一个元素的另一个副本
- 如何使用"unique"从矢量中删除重复项?
- std::unique 是否有大小限制
- 我可以使用c++中的unique命令来获取频率吗
- 在C++11中,将对象的所有权从一个unique_ptr转移到另一个unique _ptr
- 从 std::unique 返回的迭代器的用法
- QTableView and unique IDs