为什么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)
不会在我的列表视图中绘制任何内容,而我可以通过将包含必要成员的QStyleOption
和text
- 成员集传递给所需的文本来绘制具有任意标签的各种其他小部件,如下所示:< / 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()
- 呼叫似乎没有任何配置上的任何差异。
答案 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
会传递已经缩短的文件名。我认为这是一种更优雅的方式,但是不知道这个**
发生了什么仍然不能令人满意。所以,如果有人找到真正的答案,我真的很感激她/他分享它!