C++ 对于一个不断变化但只读的模型,子类QAbstractListModel的正确方法是什么?
我读过并尝试过很多东西,主要是这里列出的 基本上我有一些C++类,包含了一些属性的列表。这个列表的变化基本上超出了我的控制(硬件/网络节点出现和离开),并发出一个信号,表明它发生了变化C++ 对于一个不断变化但只读的模型,子类QAbstractListModel的正确方法是什么?,c++,qt,qml,C++,Qt,Qml,我读过并尝试过很多东西,主要是这里列出的 基本上我有一些C++类,包含了一些属性的列表。这个列表的变化基本上超出了我的控制(硬件/网络节点出现和离开),并发出一个信号,表明它发生了变化 我一直在做的测试是用C++代码类型来公开一个C++类型。这可以很好地工作,但不允许公开多个属性,并且它还可以为每次更新重置视图 C++ 另一个选项是子类化QAbstractListModel,这似乎是创建更复杂模型的“正确”方法。除了不清楚我需要覆盖哪些方法和发出哪些信号 从以下章节: 当子类化QAbstract
我一直在做的测试是用C++代码类型来公开一个C++类型。这可以很好地工作,但不允许公开多个属性,并且它还可以为每次更新重置视图
C++ 另一个选项是子类化QAbstractListModel
,这似乎是创建更复杂模型的“正确”方法。除了不清楚我需要覆盖哪些方法和发出哪些信号
从以下章节:
当子类化QAbstractListModel时,必须提供rowCount()和data()函数的实现。行为良好的模型还提供headerData()实现
好了,一切都清楚了。每个模型都需要这个
对于可编辑列表模型,还必须提供setData()的实现,并实现flags()函数,以便它返回一个包含Qt::ItemIsEditable的值
我的模型不可编辑,因此不可编辑
为可调整大小的类似列表的数据结构提供接口的模型可以提供insertRows()和removeRows()的实现。在实现这些函数时,调用适当的函数以使所有连接的视图都知道任何更改是很重要的
这就是它变得棘手的地方。我不想为可调整大小的类似列表的数据结构提供接口。但是我的模型的长度会改变
更复杂的是,上面的DataReader
只返回一个项目列表,而不是一些漂亮的insert命令,因此没有简单的方法来调用beginInsertRows
和friends
正确的方法是什么?你的问题非常广泛,如果你提供一个答案,你可以给出一个真实的答案。你可能会发现从现有的模型子类开始更容易,比如
QAbstractListModel
——然后大部分索引管理都会为你完成。怎么会太广泛?我提到了一个特定的场景:为只读但不断变化的数据集创建模型的正确方法是什么?我还写了关于QabStretcListModel的文章。@Pepijn您的数据是什么?每个项目是否表示字符串、QObject或特定对象?可能对您有用,您将完整数据作为QVariantMap列表传递给它,它将为您处理更改信号和模型部件。它对当前数据和新数据进行区分,并自动调用(begin | end)(Insert | Remove)行
和数据更改
。
Q_PROPERTY(QStringList robots READ robots NOTIFY robotsChanged)
QStringList StatusInfo::robots() {
auto samples = statusReader.read();
QStringList dataList;
for (auto& sample: samples) {
std::string id = sample->data().id();
dataList.append(QString::fromStdString(id));
}
return dataList;
}
void StatusInfo::on_data_available( dds::sub::DataReader<Operator::StatusInformation>& dr) {
emit robotsChanged();
}
ListView {
id: robotList
model: status.robots
delegate: RobotItem {}
}