2013-03-27 74 views
1

將列寬保存在QTableView中的標準做法是什麼?QTableView通過QSortFilterProxyModel隱藏/刪除某些列(以任意順序)?請注意,我正在討論在單個實例中隱藏和取消隱藏它們。QSortFilterProxyModel打破columnWidths

我已經嘗試了很多方法(所有醜陋的)來實現它。當然,我做錯了什麼。我已經看過QHeaderView :: saveState()和QHeaderView :: restoreState(),但除非我失去了一些東西,這真的只適用於保存從關機開始。一旦列以不同的順序隱藏和取消隱藏,就會中斷。

QSortFilterProxyModel使用filterAcceptsColumn()可以正常工作。警告是filterAcceptsColumn()在先前返回false的列上返回true時。我運行invalidateFilter()並將其繪製在QTableView中。但是,QTableView使用某個默認值(看起來好像是100)來代替列寬,而不是QSortFilterProxyModel隱藏列之前的寬度。

想法?

+1

對於這樣的控制,僅僅使用QHeaderView :: setSectionHidden()會更智能,並且一起去掉QSortFilterProxy? 另一個解決方案,我開始,但認爲有點太麻煩是保留一些類型的「真正的索引」與QHeaderView認爲是索引的容器。蒂姆。謝謝, – 2013-03-27 07:13:44

回答

0

是的,請改用setSectionHidden()

一般來說,您應該儘量保持與視圖相關的代碼(如在運行時顯示/隱藏列)。在我們的應用程序中,我們有QTableViewQHeaderView的子類,它們允許用戶使用上下文菜單顯示/隱藏列;顯示/隱藏列寬時(以及位置)不會被觸摸。

filterAcceptsColumn可能可能用於完全禁用像主鍵,外鍵等列。

+0

謝謝。這有幫助。 從我注意到,雖然有一個使用setSectionHidden()的警告,而不是在QSortFilterProxModel中阻塞它。也就是說,paint()仍然會繪製隱藏的單元格...至少在過濾器失效時。 [OOPS編輯:] 但是,我明白你的意思。對於任意過濾,QSortFilterProxy模型可能應該使用較少,而對於某些類型的預設過濾,QSortFilterProxy模型可能更少。似乎有道理。 任何人,我想我會繼續在這種模式下,因爲我花了太多的時間在這方面。 :) – 2013-03-27 08:59:52