我有一個QAbstractListModel存盤了一堆自定義物件的物件,您可以通過指定角色來訪問模型中自定義物件的不同欄位(如果這是對 Qt 角色的不當使用,請告訴我,因為我必須感到困惑)。我想以用戶友好的QTableView. 我可以使用代理模型顯示內容,但問題是我不想顯示原始值,我想顯示從原始資料派生的特定資料。因此,例如,我不想同時為ItemA.fooand列ItemA.bar,我只想ItemA.foo - ItemA.bar在單個列中顯示。除此之外,我希望您可以通過模型獲得自動更新功能,如果其中任一ItemA.foo或ItemA.bar更改,我希望差異列自動更新和重新計算。
我認為這樣做的方法是使用某種表代理模型來偵聽源模型,然后使用從源模型派生的值填充其自己的欄位并偵聽dataChanged()來自源模型的信號。然后將此代理模型插入到QTableView. 但對我來說,這聽起來像是應該在視圖中完成的事情。或者這是代表應該做的事情?我什至可以在基本模型本身中進行這些計算,并添加特定于應顯示在表中的這些值的角色,但這聽起來我真的讓模型的職責超載。
TLDR:您如何操作來自模型中的資料QTableView?我應該在基本模型中進行資料操作,然后將其發送到QTableView? 我應該使用代理模型來操作基礎資料并將其發送到QTableView? 還是我完全誤解了什么?
uj5u.com熱心網友回復:
并且您可以通過指定角色來訪問模型中自定義物件的不同欄位
如果您查看Qt::ItemDataRole的檔案,您會發現 Qt 模型確實應該為不同的角色提供不同的資料,但每個角色都意味著與角色對應的資料的某些不同目的。例如,最常用的角色可能是Qt::DisplayRole因為該角色的資料定義了視圖中顯示的內容,例如它是表格單元格中的文本。如果您對視圖的所有其他方面感到滿意 - 字體、背景等 - 您可以QVariant從模型中為相應的角色回傳空,視圖會自行計算出這些細節。如果您使用角色代替列,即回傳概念上相同資料項的不同部分,則可能不是角色的預期用途。
對于問題的另一部分 - 您可以通過使用委托自定義視圖中顯示的資料的外觀。例如,您可以子類化QStyledItemDelegate,覆寫其displayText方法以顯示ItemA.foo - ItemA.bar而不是僅僅顯示ItemA.foo,然后將此委托設定到與ItemA.foo通過setItemDelegateForColumn對應的視圖的列中。這里的棘手部分是檢測ItemA.foo和ItemA.bar列中的更改,這些更改會影響委托中顯示的文本。前陣子我實作了一個專門的類在我的一個專案中,它偵聽原始模型的某些列中的更改,并通過信號發射將更改“重新路由”到另一列中。我這樣做是為了解決這個問題 - 盡管從技術上講,另一個模型列會影響到未設定委托的其他模型列,但為了捕捉應顯示的委托的更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/359393.html
