QT MVC模式未更新视图特定的SimpleTreeModel示例
我在自己的代码中遇到问题,以便在更新模型数据后更新视图。QT MVC模式未更新视图特定的SimpleTreeModel示例
然后,我从QT中获取了SimpleTree示例,并在TreeModel中添加了一个计时器,在10秒后更改数据,然后调用构造函数中用于更新模型的相同集合数据函数。下面的代码是在定时器超时时执行的插槽。无论我尝试什么,视图都不会更新。 setDate和发出dataChanged是一些尝试。
在我自己的代码中,我有一个更新数据的XML-RPC调用,但考虑到我甚至没有让simpleTreeModel工作,我认为这将是一个长镜头。
我在这里有什么基础知识吗?
void TreeModel::slotTimeout(void)
{
QStringList tmp;
tmp << "qaz";
tmp << "wsx";
tmp << "edc";
setupModelData(tmp,rootItem);
setData(QModelIndex(),QModelIndex());
emit dataChanged(QModelIndex(), QModelIndex());
qDebug() << "Timer update";
}
SimpleTreeModel示例仅适用于静态模型。它缺少实现所需的QAbstractItemModel函数来更新模型。
查看模型文档的detailed description以查看应实现的内容。
问题是,缺省情况下所需的方法是作为空方法实现的,所以如果缺少某些东西,您将不会收到任何错误消息。它将无法正常工作。
另外,更改所发生的必要数据会有点棘手。
在以内setData方法你必须emit dataChanged()
。
内还需要insertRows你要调用的方法beginInsertRows(...)
和endInsertRows()
为了获得发射所需的信号。
迈向MV范例的第一个方法是使用QStandardItemModel。它提供了所有必要的实现,如果一个QStandardItem足够它通常会。
感谢您花时间回答更完整。我很感激。我在搜索中看到了这些对emit和beginInsertRows等的引用,现在它更有意义。我将通读QStandardItemModel,看看它是否能完成这项工作。我怀疑它会。 – Mikkie
下面的链接显示你说的例子,但在这种情况下,他们正在做它的可编辑。 http://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html – eyllanesc
我假设模型基于QAbstractItem模型?第一手尝试使用QStandardItemModel。关于QAbstractItemModel,你必须注意真正实现所有必要的功能,并真正调用所有必要的通知功能! – Tob
感谢您的意见。 @eyllanesc:我对可编辑示例中的定时器做了相同的测试,但它也不会更新。 – Mikkie