Python 3.x PySide中QListView的自定义ItemDelegate:项不可见 问题:

Python 3.x PySide中QListView的自定义ItemDelegate:项不可见 问题:,python-3.x,pyside,qlistview,qstyleditemdelegate,Python 3.x,Pyside,Qlistview,Qstyleditemdelegate,为什么Python的等价物会回答这个问题 不在我的listview中绘制任何内容,而我可以通过将右侧的QStyleOption包括必要的成员和text-成员设置为所需的文本来绘制具有任意标签的各种其他小部件,如下所示: class CustomDelegate(QtGui.QStyledItemDelegate): def paint(self, painter, option, index): opt = QtGui.QStyleOptionButton()

为什么Python的等价物会回答这个问题

不在我的listview中绘制任何内容,而我可以通过将右侧的
QStyleOption
包括必要的成员和
text
-成员设置为所需的文本来绘制具有任意标签的各种其他小部件,如下所示:

class CustomDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        opt = QtGui.QStyleOptionButton()
        opt.rect = option.rect
        opt.text = "Test Text"
        QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_PushButton, opt, painter)

问题背景: 在PySide中,我将
QFileSystemModel
应用于
QListView
并希望显示不带文件扩展名的文件名。
我的计划是应用继承
QStyledItemDelegate
CustomDelegate
,并在
paint()
-函数中更改
QStyleOptionViewItem
的文本成员,正如您在上面的第一个代码示例中所看到的那样。唯一的区别是:
将“测试文本”
替换为
os.path.splitext(index.data())[0]

虽然项目被插入到listview中,(我可以通过出现的滚动条和单击列表中的任意位置并打印活动项目来判断),但项目根本没有被绘制,并且保持不可见

如果我不尝试更改任何内容并传递原始的
选项
-参数,也会发生同样的情况:

class CustomDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_ItemViewItem, option, painter)

进一步资料: 如果我只调用super-
paint()
-函数,项目将正常显示:

class CustomDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        QtGui.QStyledItemDelegate.paint(self, painter, option, index)
这让我想到将自己的
opt
传递给super-
paint()

但这也会显示扩展名为的文件名。。。虽然
print()
将名称放入控制台,但没有扩展名

在将其设置为任何内容之前,试图打印
opt.text
,这让我感到很奇怪:

AttributeError: 'PySide.QtGui.QStyleOptionViewItem' object has no attribute 'text'

最后:省略
initStyleOption()
-调用似乎对任何配置都没有任何影响。

最后我找到了实现目标的方法。我仍然不知道为什么我的
CustomDelegate
行为如此怪异和不合逻辑,但我意识到我可以在早期阶段解决我的问题,并实现一个自定义
QFileSystemModel
来分配给我的
QListView

class CustomFileSystemModel(QtGui.QFileSystemModel):
    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            return os.path.splitext(QtGui.QFileSystemModel.data(self, index, role))[0]
        else:
            return QtGui.QFileSystemModel.data(self, index, role)
这样,我就可以删除我的
CustomDelegate
,默认情况下分配给
QListView
的标准
QStyledItemDelegate
将传递已缩短的文件名。我认为这是一种更加优雅的方式,但不知道这个
CustomDelegate
到底发生了什么仍然令人不满意。因此,如果有人能找到所有这些问题的真正答案,我将非常感谢她/他分享

AttributeError: 'PySide.QtGui.QStyleOptionViewItem' object has no attribute 'text'
class CustomFileSystemModel(QtGui.QFileSystemModel):
    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            return os.path.splitext(QtGui.QFileSystemModel.data(self, index, role))[0]
        else:
            return QtGui.QFileSystemModel.data(self, index, role)