2

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

我想我可以弄清楚如何重新添加信息,但是有没有办法在编辑开始时更改项目的文本?

该模型是一个 QStandardItemModel,并且项目是 QStandardItem 的相当琐碎的子类。它们主要显示在 QListView 中。

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

4

2 回答 2

4

在@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)。

完成此操作后,它似乎按预期工作。

于 2012-01-09T12:34:55.173 回答
3

您应该能够在您的项目上设置 Qt::EditRole 数据来实现这一点。在 C++ 中,它将是:

myStandareItem->setText( "Foo (38 bars)" );
myStandardItem->setData( Qt::EditRole, "Foo" );

当 Qt 在 EditRole 中看到某些内容时,它会将其用于编辑目的而不是文本(存储在 Qt::DisplayRole 下)。

然后,您可以使用诸如 QStandardItemModel::itemChanged() 信号之类的东西在项目被编辑时更新项目的显示文本。

于 2012-01-06T16:01:46.297 回答