C++ 对于一个不断变化但只读的模型,子类QAbstractListModel的正确方法是什么?

C++ 对于一个不断变化但只读的模型,子类QAbstractListModel的正确方法是什么?,c++,qt,qml,C++,Qt,Qml,我读过并尝试过很多东西,主要是这里列出的 基本上我有一些C++类,包含了一些属性的列表。这个列表的变化基本上超出了我的控制(硬件/网络节点出现和离开),并发出一个信号,表明它发生了变化 我一直在做的测试是用C++代码类型来公开一个C++类型。这可以很好地工作,但不允许公开多个属性,并且它还可以为每次更新重置视图 C++ 另一个选项是子类化QAbstractListModel,这似乎是创建更复杂模型的“正确”方法。除了不清楚我需要覆盖哪些方法和发出哪些信号 从以下章节: 当子类化QAbstract

我读过并尝试过很多东西,主要是这里列出的

基本上我有一些C++类,包含了一些属性的列表。这个列表的变化基本上超出了我的控制(硬件/网络节点出现和离开),并发出一个信号,表明它发生了变化

我一直在做的测试是用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 {}
    }