PySide中QListView的自定义ItemDelegate:项目不可见

时间:2017-03-10 15:50:31

标签: python-3.x pyside qlistview qstyleditemdelegate

问题:

为什么Python等价的this回答

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

不会在我的列表视图中绘制任何内容,而我可以通过将包含必要成员的QStyleOptiontext - 成员集传递给所需的文本来绘制具有任意标签的各种其他小部件,如下所示:< / p>

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,并希望显示没有文件扩展名的文件名。
我的计划是应用CustomDelegate继承QStyledItemDelegate并更改QStyleOptionViewItem函数内paint()的文本成员,就像我在第一个代码示例中看到的那样以上。唯一的区别是:"Test Text"替换为os.path.splitext(index.data())[0]

虽然这些项目已插入列表视图中,(我可以通过显示的滚动条和单击列表中的任意位置来打印并打印活动项目),但项目根本不会被绘制并保持不可见。

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

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

更多信息:

如果我只是调用超级paint() - 函数,则项目会正常显示:

class CustomDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        QtGui.QStyledItemDelegate.paint(self, painter, option, index)

这让我有了将自己的opt传递给超级paint()的想法:

class CustomDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        opt = QtGui.QStyleOptionViewItem(option)
        self.initStyleOption(opt, index)
        opt.text = os.path.splitext(index.data())[0]
        print(opt.text)
        QtGui.QStyledItemDelegate.paint(self, painter, opt, index)

但是这会显示带有扩展名的文件名...虽然print()会将名称放在控制台而不带扩展名。

扼杀,尝试打印opt.text 之前将其设置为任何内容都会让我:

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

最后:退出initStyleOption() - 呼叫似乎没有任何配置上的任何差异。

1 个答案:

答案 0 :(得分:0)

最后,我找到了实现目标的方法。我仍然不知道为什么我的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

这样我可以放弃QStyledItemDelegate,默认情况下分配给QListView的标准CustomDelegate会传递已经缩短的文件名。我认为这是一种更优雅的方式,但是不知道这个**发生了什么仍然不能令人满意。所以,如果有人找到真正的答案,我真的很感激她/他分享它!