2017-10-21 59 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