2014-02-06 64 views
4

我試圖構建一個用戶界面,該界面在每秒刷新數據的同時顯示錶格的內容。QTableView在模型刷新後保留選擇

因此我有機型鏈:

  • QSqlTableModel的 - 訪問的表內容
  • 爲MyModel - 從QIdentityProxyModel繼承來修改數據的位(源是爲TableModel)
  • SomeFilterModels - 其中有MyModel作爲源

此鏈結束於QTableView。由於QSqlTableModel每秒刷新一次,因此TableView中的任何選擇都會每秒被刪除。現在我有兩個想法來解決這個問題。

  1. 防止爲TableModel從檢測的變化。哪個工作不好。
  2. 捕捉模型前後發生的一些事件即將更改爲存儲,並且 恢復當前選擇。可悲的是,QIdentityProxyModel不會轉發像modelAboutToBeReset或modelReset或dataChanged這樣的信號 ..也不可能從MyModel重新發送 這些信號,因爲它們是私人的。

我正在尋找其他方法來對付那些沒有成功的刷新問題。但我無法想象,我是第一個使用代理鏈模型和定期模型刷新和選擇的人。

任何人都可以給我一些提示嗎?

在此先感謝。

也許值得大家注意:

  • QSqlTableModel的一個被用於許多TableViews。 (使用不同的FilterProxyModel鏈。)所以我不能停止刷新,因爲一個View有選擇。
  • 您可能認爲我知道何時調用模型刷新方法。但就目前來說,通過我的UI架構這個槽有點複雜。我的意思是模型被更新,並且TableView已經通過一些ProxyModels連接到更新後的模型。應該不需要另一種溝通方式。

希望我的問題有道理。

+0

我的第一條評論是隻更新模型中的更改,但由於您使用的是SQL模型,因此我懷疑您可以對變更有更多的瞭解。是否有一些標識符可以從選定的數據中獲得,以瞭解選擇了哪些項目,然後在模型刷新時找到模型索引? –

+0

@ CalebHuitt-cjhuitt我可以得到這些標識符,但我不知道何時模型刷新,以便我可以收穫選擇。 – r2p2

回答

1

QAbstractItemModel包含許多信號,可以幫助您瞭解模型中的數據何時或將會發生何種變化。特別是,它具有下列信號:

  • dataChanged
  • headerDataChanged
  • modelAboutToBeReset
  • modelReset
  • columnsAboutToBeInserted
  • columnsAboutToBeMoved
  • columnsAboutToBeRemoved
  • columnsInserted
  • columnsMoved
  • columnsRemoved
  • rowsAboutToBeInserted
  • rowsAboutToBeMoved
  • rowsAboutToBeRemoved
  • rowsInserted
  • rowsMo​​ved
  • rowsRemoved

鑑於你失去了選擇,我認爲粗體信號是你想要關注的信號,因爲默認的Qt行爲是保留選擇,如果他們可以在列或行被刪除/插入的地方,它不會'不影響選擇。

一旦你連接到這些信號,在modelAboutToBeReset我建議你可以重複使用再次選擇它的單元獲得的ID,並在modelReset然後用這些ID來獲得QModelIndex S和使用他們再次選擇相同細胞。

+0

很遺憾,這不起作用,因爲QIdentityProxyModel不能傳遞這些信號。 – r2p2