在樹型部件QTreeWidget中,有三種方法觸發進行項數據的編輯:editTriggers觸發編輯、editItem觸發編輯和openPersistentEditor打開持久編輯器。
1、editTriggers觸發編輯
在《PyQt(Python+Qt)學習隨筆:QAbstractItemView的editTriggers屬性以及平台編輯鍵(platform edit key )》介紹了QAbstractItemView可以通過設置editTriggers來觸發編輯,而QTreeWidget是QAbstractItemView類派生的,繼承了該屬性,因此通過設置該屬性為非NoEditTriggers的值即可觸發編輯。
editTriggers可以在Qt Designer中設置,如圖:

也可以調用setEditTriggers(EditTriggers triggers)來觸發,關於EditTriggers 枚舉類請參考PyQt(Python+Qt)學習隨筆:QAbstractItemView的editTriggers屬性以及平台編輯鍵(platform edit key )》。
注意:
要使得editTriggers能觸發編輯,必須將項設置為可編輯的,但老猿驗證發現QTreeWidget的flags()值默認為61,不能編輯(請參考《PyQt(Python+Qt)學習隨筆:Model中項的標記flags取值及枚舉類型Qt.ItemFlag》)。因此必須設置項為可編輯的,要能對項進行編輯必須使用setFlags設置項為可編輯。可以參考如下代碼示例來設置:
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
2、editItem觸發編輯
QTreeWidget提供了進行項編輯的方法editItem,調用語法如下:
editItem(QTreeWidgetItem item, int column = 0)
注意:
- editItem方法生效必須設置項的標記flags為可編輯
- editItem一次只能觸發一個項指定的列進行編輯,一旦退出編輯狀態(如改變焦點),除非再次調用editItem或設置editTriggers觸發編輯或打開永久編輯器否則對應項不能再編輯
- 連續多次調用editItem,中間沒有觸發事件處理,則只有第一次調用生效,后續調用無效
3、openPersistentEditor打開持久編輯器
上面介紹editItem時說明了editItem只能觸發一次編輯,可以說進入臨時編輯狀態,一旦退出編輯除非再通過相關方式觸發編輯否則項不可再編輯。與此相對應,QTreeWidget還提供了一種一旦打開編輯狀態就可以隨時再次編輯,除非顯示關閉編輯狀態,這種方式就是打開持久編輯器。調用方法如下:
openPersistentEditor(QTreeWidgetItem item, int column = 0)
該方法沒有返回值。
注意:
- openPersistentEditor在在樹型部件設置了editTriggers為NoEditTriggers時也有效
- openPersistentEditor在在樹型部件項的flags值設置為不能編輯情況下,也能觸發項編輯,並且除非調用closePersistentEditor()方法,否則對應項的對應列一直都能編輯
4、項編輯小結
樹型部件中項的編輯方法包括editTriggers觸發編輯、editItem觸發編輯和openPersistentEditor打開持久編輯器,這三種方法:
- editTriggers觸發編輯、editItem觸發編輯必須要求項的標記flags支持編輯,而openPersistentEditor對項標記沒有要求
- 在所有項flags支持編輯的情況下,在樹型部件設置了editTriggers為AllEditTriggers時,如果在觸發編輯的事件中調用editItem,實際能編輯的項是editTriggers觸發的項,editItem指定的項無法編輯。老猿分析這與editItem連續調用相同,只有先觸發的才有效
- editTriggers觸發編輯、editItem觸發編輯都是一次性的,一旦退出編輯狀態除非再次觸發,否則不能再進行編輯,但openPersistentEditor是持久編輯,可以隨時進行編輯,除非調用closePersistentEditor()方法關閉編輯狀態
三種方法各有特色,關鍵是看在什么時候使用,editTriggers方式是使用方便,只需要樹型部件中設置一次即可,而editItem和openPersistentEditor 必須按項的列指定,但可以方便控制數據不能隨意修改。

