PyQt(Python+Qt)學習隨筆:樹型部件QTreeWidget中的項編輯方法editTriggers、editItem和openPersistentEditor作用及對比分析


在樹型部件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 必須按項的列指定,但可以方便控制數據不能隨意修改。

老猿Python,跟老猿學Python!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM