QStyledItemDelegate中createEditor的父类是什么?(PySide/PyQt/Qt)

3
我有一个使用QStandardItemModelQTreeView。我正在使用自定义委托绘制/编辑数据。在createEditor方法中,我使用parent.window()访问整个应用程序的主窗口(请参见下面链接到另一个问题的代码)。
问题:在委托中,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没有找到太多帮助:
如果parent参数不是None,self将被Qt拥有而不是PyQt。重新实现自QAbstractItemDelegate.createEditor()。返回用于编辑索引指定的项以进行编辑的小部件。父窗口和样式选项用于控制编辑器小部件的外观。
请注意,这一切都是由此处解决方案评论中讨论的另一个问题的解决方案开始的。

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


当我提出这个问题时,我深陷在棘手的问题中 - 我希望我早知道QProxyStyle - eric
1个回答

3
父级是使用委托的视图的视口小部件。视口是由视图继承的滚动区域的一部分。
因此,在您的特定示例中:
    def createEditor(self, parent, option, index):
        print(parent is parent.window().tree.viewport()) # True

嗯...这很反直觉!我想知道为什么使用常规类型/元技巧查找正在处理的对象类型如此困难...它害怕什么? - eric
1
@neuronet。我认为这是一个实现细节,所以视口被设置为父级。我认为之所以选择父级作为视口,是因为它是接收鼠标和键盘事件的小部件。 - ekhumoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接