1

问题:

为什么这个答案的 Python 等效项

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)

不要在我的列表视图中绘制任何内容,而我可以通过将QStyleOption包括必要成员和text-member 设置为所需文本的权利传递给任意标签来绘制各种其他小部件,如下所示:

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应用于 aQListView并希望显示没有文件扩展名的文件名。
我的计划是应用 a CustomDelegatewhich 继承QStyledItemDelegate并更改-functionQStyleOptionViewItem内部的a 的文本成员,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()-call 似乎对任何配置都没有任何影响。

4

1 回答 1

1

最后,我找到了实现目标的方法。我仍然不知道为什么我的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的并且QStyledItemDelegate分配给QListView每个默认值的标准会通过已经缩短的文件名。我认为这是一种更优雅的方式,但不知道这个CustomDelegate. 因此,如果有人找到了所有这些的真正答案,我将非常感谢她/他分享它!

于 2017-03-12T13:28:26.177 回答