2009-10-27 289 views
4

這是一個Qt特定的問題。在Qt中,創建一個包含空白可編輯行的表格

通過在表格底部的空白行中輸入內容,可以方便地向表中添加新數據。提交數據時,將新的空行添加到表中。

有沒有人找到一種通用的方式實現這一點,這適合於Qt的模型視圖編程體系結構?我最近的嘗試涉及創建一個代理模型,這樣從模型返回的rowCount()總是比源模型大一個。

QAbstractTableModel* sourceModel ; // Data is stored here 
QBlankRowModel* model ; // Proxy model that adds one to rowCount() 
QTableView* view ; // View 
view->setModel(model) ; 
model->setSourceModel(sourceModel) ; 

歡迎任何建議。謝謝。

回答

0

聽起來像一個合理的解決方案,因爲它應該適用於任何你可能想要的模型作爲實際的表模型,即。 SqlTableModel或只是一個普通的。只要您在用戶編輯完成後添加行,並注意不要在用戶未添加任何數據時添加該行。

1

你的解決方案似乎有點ha。。你的問題不僅僅是增加,它還是版本。當用戶編輯一行時,會發生什麼情況,甚至在用戶提交他的版本之前,類型化數據會直接進入「數據層」?

更好的解決方案是限制你的sourceModel的角色。它不應該成爲數據的「直接」表示,而應該是它的「緩衝」表示。在創建sourceModel時,您可以在某種Row()實例中創建數據的副本。該sourceModel,有它自己的數據副本就可以自由地玩耍,執行版本和補充,當用戶提交自己的編輯只將數據提交到模型層。

如果你想這樣的表的PyQt的例子,你可以看看我的一個項目的源:

http://hg.hardcoded.net/moneyguru/

你可能要挖周圍居然找到了「緩衝」的邏輯因爲它不是在PyQt的代碼本身,而是代碼的「跨平臺」的一部分:

http://hg.hardcoded.net/moneyguru/src/tip/core/gui/table.py

這個邏輯,然後在我的子類化QAbstractItemModel使用:

http://hg.hardcoded.net/moneyguru/src/tip/qt/controller/table.py

2

從設計的角度來看,這應該是視圖,而不是模型的一部分。因此,我建議使用功能來實現視圖,並保持模型不變。 KOfficeKexi不只是這跟kexitableviewscreenshotdocumentation)。也許你想使用他們的一些代碼。

順便說一句,你仍可以通過將其放入一個新的表視圖實現YourTableView內使用您的黑客,我的建議結合起來:

  1. QBlankRowModel重新實現 QAbstractTableModel 接口。它返回sourceModel.rowCount()+1作爲QBlankRowModel::rowCount()。 它返回一個QVariant()如果n+1個行在QBlankRowModel::data()要求。 所有內QBlankRowModel其餘部分被轉發到sourceModel(用編輯 的n+1第i行QBlankRowModel緩衝和與完成時插入 sourceModel取代)。

  2. QTableViewYourTableView繼承幷包裝sourceModelYourTableView::setModel(),呼籲 QTableView::setModel(QBlankRowModel(sourceModel))

因此,你的黑客被集中在一個地方。

相關問題