2015-10-04 75 views
2

我有一個QTreeViewQStandardItemModel。我正在使用自定義代理繪製/編輯數據。在createEditor方法中,我使用parent.window()來訪問整個應用程序的主窗口(參見下面鏈接到另一個問題的一些代碼)。QStyledItemDelegate(PySide/PyQt/Qt)中createEditor的父級是什麼?

問題:代表中createEditor的父項是什麼?它被定義下列參數:

def createEditor(self, parent, option, index) 

什麼是混淆當QStyledItemDelegate被初始化,並且我打印type(parent),我得到的樹回來(我做出這個代理,顯示樹) 。這是我期望的。但是,當我這樣做並在createEditor方法實現中打印type(parent)時,它只會返回QWidget。我得到同樣的當我運行parent.metaObject().className()這是一個建議,我從這裏得到:

QT : get the class name of an object

當我試圖拉我在樹視圖中已經定義的屬性,如parent.rootItem,我得到一個屬性錯誤。那麼,這裏發生了什麼?我的編輯的父母是什麼?

我不覺得從PyQt documentation太大的幫助:

父的說法,如果不是無,導致自我被Qt 而不是PyQt的擁有。從 重新實現QAbstractItemDelegate.createEditor()。返回編輯 由索引指定的項目以進行編輯的小部件。父控件和樣式 選項用來控制編輯器部件的顯示

注意這是所有的解決方案開始在意見解決這裏討論不同的問題:

https://stackoverflow.com/a/32928091/1886357

回答

3

父代是使用委託的視圖的viewport widget。視口是視圖繼承的Scrollarea的一部分。

因此,在你具體的例子:

def createEditor(self, parent, option, index): 
     print(parent is parent.window().tree.viewport()) # True 
+0

嗯....這是違反直覺的!我想知道爲什麼使用正常的類型/元技巧找出你正在使用的對象類型是如此困難....它有什麼害怕的? – neuronet

+1

@neuronet。我想是因爲它是一個實現細節。我認爲視口被設置爲父窗口,因爲那是接收鼠標和鍵盤事件的窗口部件 – ekhumoro