使用Qt4的模型/视图框架,我有一个显示为“Foo(38条)”的项目列表。我想使文本可编辑,但是当用户开始编辑时,我希望控件只显示“Foo”(名称),然后在编辑完成时恢复额外信息“(38条)”。
我想我可以知道如何添加信息,但有没有办法在编辑开始时更改项目的文本?
模型是QStandardItemModel,项目是QStandardItem的相当简单的子类。它们主要显示在QListView中。
UI是用PyQt编写的,我不想仅为此深入研究C ++,但如果它们出现,我会尽力翻译C ++解决方案。
答案 0 :(得分:4)
在@Chris让我走上正轨之后,我发现了这个音符in the docs for 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)
最后,“bar”的数量可以在其他地方更改,这应该触发任何视图来更新项目。因此,在更改之后,我调用了item.emitDataChanged()
方法(docs)。
完成后,它似乎按预期工作。
答案 1 :(得分:3)
您应该可以在项目上设置Qt :: EditRole数据来实现此目的。在C ++中它将是:
myStandareItem->setText( "Foo (38 bars)" );
myStandardItem->setData( Qt::EditRole, "Foo" );
当Qt在EditRole中看到某些内容时,它会将其用于编辑目的而不是文本(存储在Qt :: DisplayRole下)。
然后,您可以使用QStandardItemModel :: itemChanged()信号来更新项目的显示文本。