【问题标题】:Change text of QStandardItem when editing starts编辑开始时更改 QStandardItem 的文本
【发布时间】:2012-01-06 15:25:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: qt pyqt4 qstandarditemmodel


    【解决方案1】:

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

    最后,“条”的数量可以在其他地方更改,这应该会触发任何视图来更新项目。所以在更改之后,我调用了item.emitDataChanged() 方法(docs)。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 开始编辑时是否必须发出itemChanged() 信号?您应该只调用一次myStandardItem->setData( Qt::EditRole, "Foo" );,然后才应该使用signalChanged();
      • 谢谢,我明天试试。
      • 这是我了解如何解决问题所需的关键。我已经把我实际必须做的事情写成了一个单独的答案,因为还有更多内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2011-09-17
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多