编辑开始时更改QStandardItem的文本

时间:2012-01-06 15:25:08

标签: qt pyqt4 qstandarditemmodel

使用Qt4的模型/视图框架,我有一个显示为“Foo(38条)”的项目列表。我想使文本可编辑,但是当用户开始编辑时,我希望控件只显示“Foo”(名称),然后在编辑完成时恢复额外信息“(38条)”。

我想我可以知道如何添加信息,但有没有办法在编辑开始时更改项目的文本?

模型是QStandardItemModel,项目是QStandardItem的相当简单的子类。它们主要显示在QListView中。

UI是用PyQt编写的,我不想仅为此深入研究C ++,但如果它们出现,我会尽力翻译C ++解决方案。

2 个答案:

答案 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()信号来更新项目的显示文本。