我正在检查项目重新排列的模型/视图,我无法理解如何覆盖insertRows
方法。仅仅是为了练习,我试图用自定义结构包装std::vector
。
std::vector<aStruct> mD;//my data
bool insertRows(int start, int rows, const QModelIndex & parent)
{
auto i = parent.row();
cout <<"I going to " << start << ":" << rows << " choosing "<< i<< endl;
beginInsertRows(parent, start, start + rows - 1);
aStruct blank(0);// Should be the value of the item being moved?
mD.insert(mD.begin()+start,blank);
endInsertRows();
return true;
}
不幸的是,我似乎无法找到一个可以让我抓住被移动物品的元素的地方。我该怎么做?
答案 0 :(得分:1)
我认为mD
和insertRows
是自定义模型类的成员。
insertRows
未收到有关插入行内容的任何信息。应插入空值。行应填充setData
虚拟方法实现中的数据。
答案 1 :(得分:0)
您应该使用后续步骤插入行:
1. Call beginInsertRows
2. Modify your internal data structure
3. Call endInsertRows
你的样本中都没问题。
视图将在调用endInsertRows
后插入空行(如@Riateche所述)并自动填充。您需要的只是覆盖YourModel::data
方法以从您的mD结构返回正确的数据。
View会在插入空行后立即调用YourModel::data
方法。您不需要执行任何额外操作。 View会关心“填充”它。
当用户想要通过视图小部件更改数据时,覆盖YourModel::setData
方法主要用于视图和模型之间的交互。