使用Qt4的模型/视图框架,我有一个显示为"Foo(38条)"的项目列表。我想让文本可编辑,但当用户开始编辑时,我希望控件只显示"Foo"(名称),然后在编辑完成时恢复额外的信息"(38条)"。
我想我可以想出如何将信息添加回来,但有没有办法在编辑开始时更改项目的文本?
该模型是一个QStandardItemModel,并且这些项是QStandardItem的相当琐碎的子类。它们主要显示在QListView中。
UI是用PyQt编写的,我不想仅仅为此深入研究C++,但如果出现C++解决方案,我会尽我所能翻译它们。
@Chris让我走上正轨后,我在QStandardItem:的文档中发现了这条注释
默认实现将Qt::EditRole和Qt::DisplayRole视为参考相同的数据。
所以我需要重写方法QStandardItem.data()
。我的Python代码看起来是这样的:
def data(self, role=QtCore.Qt.UserRole+1):
if role == QtCore.Qt.DisplayRole:
return "{} ({} bars)".format(self.name, len(self.ds))
return super().data(role) # Fall back to the default method
在模型的itemChanged
信号上,我更新了我正在使用的.name属性:
def update_name(self):
self.name = self.data(QtCore.Qt.EditRole)
最后,"条"的数量可以在其他地方更改,这应该会触发任何视图来更新项目。因此,在更改后,我调用了item.emitDataChanged()
方法(docs)。
完成这项工作后,它似乎正在按预期工作。
您应该能够在项目上设置Qt::EditRole数据来实现这一点。在C++中,它将是:
myStandareItem->setText( "Foo (38 bars)" );
myStandardItem->setData( Qt::EditRole, "Foo" );
当Qt在EditRole中看到某些内容时,它会将其用于编辑目的,而不是文本(存储在Qt::DisplayRole下)。
然后,您可以使用类似QStandardItemModel::itemChanged()信号的东西来在编辑项目时更新项目的显示文本。