PySide 中 QListView 的自定义 ItemDelegate:项目不可见
Custom ItemDelegate for QListView in PySide: Items invisible
问题:
为什么 this 的 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
应用于 QListView
,并希望显示不带文件扩展名的文件名。
我的计划是应用继承 QStyledItemDelegate
的 CustomDelegate
并更改 paint()
函数内 QStyleOptionViewItem
的文本成员,正如您在我的第一个代码示例中看到的那样多于。唯一区别:"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()
将文件名 不带 [=66] =] 扩展。
奇怪的是,尝试打印 opt.text
before 将其设置为任何东西让我:
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
是怎么回事仍然令人不满意。因此,如果有人找到所有这些问题的 真实 答案,我将非常感谢 her/him 分享它!
问题:
为什么 this 的 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
应用于 QListView
,并希望显示不带文件扩展名的文件名。
我的计划是应用继承 QStyledItemDelegate
的 CustomDelegate
并更改 paint()
函数内 QStyleOptionViewItem
的文本成员,正如您在我的第一个代码示例中看到的那样多于。唯一区别:"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()
将文件名 不带 [=66] =] 扩展。
奇怪的是,尝试打印 opt.text
before 将其设置为任何东西让我:
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
是怎么回事仍然令人不满意。因此,如果有人找到所有这些问题的 真实 答案,我将非常感谢 her/him 分享它!