2016-05-31 118 views
2

我迄今所做的缺失:編輯表,而內容

我實現一個自定義的QAbstractTableModel(在QTableView -Widget使用),其中包含可編輯單元格。這些細胞的性質在我flags()方法,看起來像這樣規定的:在頭兩列

def flags(self, index): # Qt was imported from PyQt4.QtCore 
    if index.column() < 2: 
     return Qt.ItemIsEditable | Qt.ItemIsEnabled | \ 
       Qt.ItemIsSelectable 
    else: 
     return Qt.ItemIsEnabled | Qt.ItemIsSelectable 

細胞標記爲可編輯的,就像我想要的。

我想要做什麼:

單擊該單元格但雙時觸發編輯包含的文本被刪除,空場中。

Example of editing a cell

但我不希望刪除&替換包含的文本,因爲包含的文本可能會很長,而且不應該被重新輸入。我只想編輯已經包含的內容。當雙擊單元格時,應該可以使用之前包含的文本進行編輯(可能已經選中)。

問題:

我怎樣才能實現這種行爲?我是否需要編輯我的標誌方法併爲這些單元指定不同的屬性?

回答

2

您有幾個選項。

編輯過程中沒有數據出現在單元格中,因爲您可能尚未在模型中的每個項目的Qt.EditRole上設置任何數據。 QTableWidget的做法是默認的。

這樣做的另一種方法是使用QItemDelegate。這將允許您手動創建編輯器小部件,並在其出現在QTableView之前將其初始化。如果編輯文本尚未填充,則可以使用顯示角色文本。

class MyDelegate(QtGui.QItemDelegate): 

    def createEditor(self, parent, option, index): 
     if index.column() == 2: 
      return super(MyDelegate, self).createEditor(parent, option, index) 
     return None 

    def setEditorData(self, editor, index): 
     if index.column() == 2: 
      # Gets display text if edit data hasn't been set. 
      text = index.data(Qt.EditRole) or index.data(Qt.DisplayRole) 
      editor.setText(text)   

delegate = MyDelegate() 
tableview.setItemDelegate(delegate) 
+0

謝謝。我用'QItemDelegate'試過了你的第二種方法,它的工作方式和預期的一樣。如果我想在不使用類的情況下設置'Qt.EditRole',我該怎麼做?我需要在自定義的'TableModel'中定義一個新的方法嗎? – aisen

+0

我不認爲你應該在你的模型中做任何事情。雖然,這是值得懷疑的,爲什麼你需要*創建一個自定義模型。 'QStandardItemModel'不工作?如果您只想控制標誌,則可以在創建項目時對其進行設置。它不一定是模型上的動態函數。 –

+0

嗯,我只是想清楚如何用PyQt做任何事情,甚至不知道有什麼像標準的類。我會查找它。 – aisen