在 PySide 中覆盖 text() QtGui.QStandardItem
Overriding text() in PySide QtGui.QStandardItem
我有一个 class 覆盖 QtGui.QStandardItem:
的 text() 方法
class SourceFileItem(QtGui.QStandardItem):
def __init__(self, name):
super(SourceFileItem, self).__init__("Original Name")
def text(self):
return "Name from Override"
但是当我将其添加到 QStandardItemModel 并将其设置为 listView 的模型时,只有调用parent class' 显示了 init 方法,但根本没有证据表明我的重写方法被调用了。
文档似乎表明这是返回显示文本的正确方法:
PySide.QtGui.QStandardItem.text()
Return type: unicode
Returns the item’s text. This is the text that’s presented to the user in a view.
这行不通,因为 QStandardItem.text
不是虚函数。
正如您已经发现的那样,重写非虚函数大多是无用的,因为尽管它在 Python 方面可以正常工作,但在 C++ 方面是不可见的,因此它永远不会被 Qt 内部调用。
然而,在这种特殊情况下,并没有丢失所有内容,因为 text()
函数大致等同于:
def text(self):
return self.data(QtCore.Qt.DisplayRole)
和QStandardItem.data
是虚拟的。
所以你只需要这样的东西:
def data(self, role=QtCore.Qt.UserRole + 1):
if role == QtCore.Qt.DisplayRole:
return 'Name from Override'
return super(SourceFileItem, self).data(role)
现在您重写的 data()
函数将由 Qt 从其 text()
函数中调用。
我有一个 class 覆盖 QtGui.QStandardItem:
的 text() 方法class SourceFileItem(QtGui.QStandardItem):
def __init__(self, name):
super(SourceFileItem, self).__init__("Original Name")
def text(self):
return "Name from Override"
但是当我将其添加到 QStandardItemModel 并将其设置为 listView 的模型时,只有调用parent class' 显示了 init 方法,但根本没有证据表明我的重写方法被调用了。
文档似乎表明这是返回显示文本的正确方法:
PySide.QtGui.QStandardItem.text()
Return type: unicode
Returns the item’s text. This is the text that’s presented to the user in a view.
这行不通,因为 QStandardItem.text
不是虚函数。
正如您已经发现的那样,重写非虚函数大多是无用的,因为尽管它在 Python 方面可以正常工作,但在 C++ 方面是不可见的,因此它永远不会被 Qt 内部调用。
然而,在这种特殊情况下,并没有丢失所有内容,因为 text()
函数大致等同于:
def text(self):
return self.data(QtCore.Qt.DisplayRole)
和QStandardItem.data
是虚拟的。
所以你只需要这样的东西:
def data(self, role=QtCore.Qt.UserRole + 1):
if role == QtCore.Qt.DisplayRole:
return 'Name from Override'
return super(SourceFileItem, self).data(role)
现在您重写的 data()
函数将由 Qt 从其 text()
函数中调用。