编辑开始时更改QStandardItem的文本



使用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()信号的东西来在编辑项目时更新项目的显示文本。

最新更新