Qt 模型视图:更新模型的正确方法是什么,然后在 std::vector 中在模型外部存储和更改数据时更新视图
Qt Model-View: What's the correct way to update the model and then the view when the data is stored and changed outside the model in a std::vector
我已经对 QTableModel 进行了子class,我想要显示的数据是 std::vector 的内容,我在我的模型中引用了它。
我已经 subclassed 一个 QTableView 来表示 MyClass 对象并在不同的列中显示 MyClass 对象的不同属性。
最初,我得到了我想要显示的内容:显示了初始化的 std::vector 和我放入其中的 10 个元素。
之后我想做的是通过其他小部件将元素添加到 std::vector 并相应地更新模型和视图。
因此,我必须以某种方式将更改通知模型,并且根据我从阅读类似问题和 Qt 示例中收集到的信息,应该这样做:
在向 std::vector 添加元素之前,我必须首先通知模型我将要插入一些行。所以我所做的是在我的模型 class 中创建一个成员函数,它基本上是这样做的:
beginInsertRows(QModelIndex(), lastdisplayedrow, lastdisplayedrow+1);
myvector.push_back(myclassobject);
endInsertRows();
由于我没有显示新元素,我决定我也需要做这样的事情:
emit dataChanged(args_that_represent_the_new_row);
但是,我无法显示新的 MyClass 对象。
无论 beginInsertRows 中的参数是什么,新行总是附加在末尾。我的意思是,即使我传递
之类的参数,我也无法在已显示的行之间获取新行
beginInsertRows(QModelIndex(), 0, 1);
对我做错了什么有什么想法吗?
感谢 king_nak 注意到这个错误,不幸的是这个错误是在我的问题中而不是在我的代码中。 lastdisplayedrow 确实是我的向量的大小。
我剩下的问题是(我为我的方法是正确的可能性留有余地我只是在我的代码中搞砸了一些东西):
- 这是处理存储在模型外部的数据的正确方法吗?
UPD
对于任何想知道的人:这似乎是正确的方法,因为我刚刚设法让它工作。我要归功于 king_nak 基本上发现了我提供的小片段有什么问题。至于我的问题的真正根源:这对我来说是一个愚蠢的错误:当覆盖 rowCount 时,我只是返回了我的 nRow 成员的值,它只在构造函数中用 myvector.size().
对beginInsertRows
的调用似乎不正确:
beginInsertRows(QModelIndex(), lastdisplayedrow, 1);
这意味着您将在范围 [lastdisplayedrow
、1
] 中插入行。此函数中的参数指定要插入的行的开始索引和结束索引(参见 QAbstractItemModel::beginInsertRows)。您的呼叫应如下所示:
beginInsertRows(QModelIndex(), lastdisplayedrow, lastdisplayedrow + 1);
假设 lastdisplayedrow
等于向量的大小。
我已经对 QTableModel 进行了子class,我想要显示的数据是 std::vector 的内容,我在我的模型中引用了它。 我已经 subclassed 一个 QTableView 来表示 MyClass 对象并在不同的列中显示 MyClass 对象的不同属性。 最初,我得到了我想要显示的内容:显示了初始化的 std::vector 和我放入其中的 10 个元素。 之后我想做的是通过其他小部件将元素添加到 std::vector 并相应地更新模型和视图。 因此,我必须以某种方式将更改通知模型,并且根据我从阅读类似问题和 Qt 示例中收集到的信息,应该这样做: 在向 std::vector 添加元素之前,我必须首先通知模型我将要插入一些行。所以我所做的是在我的模型 class 中创建一个成员函数,它基本上是这样做的:
beginInsertRows(QModelIndex(), lastdisplayedrow, lastdisplayedrow+1);
myvector.push_back(myclassobject);
endInsertRows();
由于我没有显示新元素,我决定我也需要做这样的事情:
emit dataChanged(args_that_represent_the_new_row);
但是,我无法显示新的 MyClass 对象。 无论 beginInsertRows 中的参数是什么,新行总是附加在末尾。我的意思是,即使我传递
之类的参数,我也无法在已显示的行之间获取新行beginInsertRows(QModelIndex(), 0, 1);
对我做错了什么有什么想法吗? 感谢 king_nak 注意到这个错误,不幸的是这个错误是在我的问题中而不是在我的代码中。 lastdisplayedrow 确实是我的向量的大小。 我剩下的问题是(我为我的方法是正确的可能性留有余地我只是在我的代码中搞砸了一些东西): - 这是处理存储在模型外部的数据的正确方法吗?
UPD
对于任何想知道的人:这似乎是正确的方法,因为我刚刚设法让它工作。我要归功于 king_nak 基本上发现了我提供的小片段有什么问题。至于我的问题的真正根源:这对我来说是一个愚蠢的错误:当覆盖 rowCount 时,我只是返回了我的 nRow 成员的值,它只在构造函数中用 myvector.size().
对beginInsertRows
的调用似乎不正确:
beginInsertRows(QModelIndex(), lastdisplayedrow, 1);
这意味着您将在范围 [lastdisplayedrow
、1
] 中插入行。此函数中的参数指定要插入的行的开始索引和结束索引(参见 QAbstractItemModel::beginInsertRows)。您的呼叫应如下所示:
beginInsertRows(QModelIndex(), lastdisplayedrow, lastdisplayedrow + 1);
假设 lastdisplayedrow
等于向量的大小。