2009-11-16 74 views
2

我正在使用一個小型的qt應用程序(使用PyQt4),我想出了一個想法,但我不確定如何實現它。我有一個QTableView代表一些數據,我想向QTableView添加另一列,其中包含一個複選框控件,可以連接到模型的某個部分。例如,像這樣:在QTableView中嵌入控件?

alt text

注意刪除列有各行的複選框控件(雖然這是一個web應用程序,而不是一個桌面應用程序的Qt,主要是相同的)。如果我可以選擇多行,點擊右鍵,然後選擇「選中/取消選中」。

如果有任何不清楚的地方,請在這裏留言,我會澄清。

回答

6

實現自己的表模型比使用QStandardItemModel(如@Andy建議)更多的工作,但它確實給你罰款控制你想做什麼,所以我會試着給你一個做什麼的總結。我假設你知道Qt's documentationPyQt's class documentation的全部內容,並且可以查找你需要的任何類。 (我可能會overexplaining如果你已經有了一個QTableView但不是讓出來的東西好,我想。)

爲了得到辨認的狀態:

  • 創建的QTableModel一個子類。
    • 選擇一些數據結構來存儲行的內容。這可能非常簡單(一個大的內部列表),或者像SQL數據庫一樣複雜(在這種情況下,請參閱QSqlTableModel)。
    • 替代rowCount,columnCount,datasetData
      • rowCountcolumnCount與您用於數據模型的內容相當直接。如果您基本上使用二維數組(或列表清單),則它們可以短至一行。
      • data是事情變得有趣的地方。項目模型存儲幾個不同的字段(Qt呼叫角色)以及data返回的內容取決於要求的角色。請注意,我會討論返回的數據類型,但總是需要將其包裝爲QVariant
        • Qt.DisplayRole是任何文本顯示在表的單元格中。這是您的實際數據,並且是常見情況(因此這是默認角色)。
        • Qt.CheckStateRole是一個布爾值。返回Qt.Checked將顯示一個選中的複選框,Qt.Unchecked將返回一個未選中的複選框。如果所有你想要包含的列是複選框只處理這個角色。
        • 其他角色對於圖標,背景顏色以及其他許多功能都很有用。
        • 任何未處理的角色應返回QVariant
      • setData對稱於data。您應該處理您在dataQt.DisplayRole中處理的實際數據角色,以及Qt.CheckStateRole作爲複選框。

爲了允許的行和列和細胞的多個選擇。要做到這一點,你想了解selection models。簡短的版本是:

  • 設置你的表視圖選擇模式view.setSelectionMode(QAbstractItemView.ContiguousSelection)。這會讓你突出顯示連續的單元格。您還可以突出顯示任意單元格:請參閱QAbstractView.SelectionMode
  • 要確定哪些細胞實際上被選擇以下的動作問其選擇模型表視圖(注意「L」):view.selectionModel().selectedIndexes()。您可以用for循環遍歷這些循環。

要允許右鍵點擊:

  • 重寫你的觀點的contextMenuEvent
  • 創建一個QMenu並將其連接到您需要的任何插槽。

如需更深入瞭解,請閱讀Qt guide to Model/View(如果您尚未閱讀)。絕對看看Qt item view examples。其中許多描述是在PyQt中用更少的代碼(包括兩個@Jesse提到的)實現的,而樹模型示例繼承到表,但工作量少得多(如上所述,您需要實現更少的工作)。

3

你也可以看看在QStandardItemModel,讓您通過「可檢查」狀態的項目進行交互的界面!

你也可以從化QAbstractItemModel繼承和使用Qt的作用:: CheckStateRole ...

相關問題