2017-10-21 28 views
1

我在自己的代码中遇到问题,以便在更新模型数据后更新视图。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"; 
} 
+0

下面的链接显示你说的例子,但在这种情况下,他们正在做它的可编辑。 http://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html – eyllanesc

+0

我假设模型基于QAbstractItem模型?第一手尝试使用QStandardItemModel。关于QAbstractItemModel,你必须注意真正实现所有必要的功能,并真正调用所有必要的通知功能! – Tob

+0

感谢您的意见。 @eyllanesc:我对可编辑示例中的定时器做了相同的测试,但它也不会更新。 – Mikkie

回答

1

SimpleTreeModel示例仅适用于静态模型。它缺少实现所需的QAbstractItemModel函数来更新模型。

查看模型文档的detailed description以查看应实现的内容。

问题是,缺省情况下所需的方法是作为空方法实现的,所以如果缺少某些东西,您将不会收到任何错误消息。它将无法正常工作。

另外,更改所发生的必要数据会有点棘手。

以内setData方法你必须emit dataChanged()

内还需要insertRows你要调用的方法beginInsertRows(...)endInsertRows()为了获得发射所需的信号。

迈向MV范例的第一个方法是使用QStandardItemModel。它提供了所有必要的实现,如果一个QStandardItem足够它通常会。

+0

感谢您花时间回答更完整。我很感激。我在搜索中看到了这些对emit和beginInsertRows等的引用,现在它更有意义。我将通读QStandardItemModel,看看它是否能完成这项工作。我怀疑它会。 – Mikkie