Изменить текст QStandardItem при начале редактирования - PullRequest
2 голосов
/ 06 января 2012

Используя каркас модели / вида Qt4, у меня есть список элементов, отображаемых как «Foo (38 баров)».Я хочу сделать текст редактируемым, но когда пользователь начинает редактирование, я хочу, чтобы элемент управления просто показал «Foo» (имя), а затем восстановил дополнительную информацию «(38 баров)» после завершения редактирования.

Я думаю, что могу решить, как добавить информацию обратно, но есть ли способ изменить текст элемента, когда начинается редактирование?

Модель QStandardItemModel, и элементы довольнотривиальные подклассы QStandardItem.Они отображаются в основном в QListView.

Пользовательский интерфейс написан на PyQt, и я бы предпочел не погружаться в C ++ только для этого, но я сделаю все возможное, чтобы перевести решения C ++, если они появятся.

Ответы [ 2 ]

4 голосов
/ 09 января 2012

После того, как @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 ).

После этого он, кажется, работает как задумано.

3 голосов
/ 06 января 2012

Вы должны быть в состоянии установить данные Qt :: EditRole для ваших предметов, чтобы достичь этого.В C ++ это будет:

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

Когда Qt видит что-то в EditRole, он будет использовать это для целей редактирования вместо текста (который хранится в Qt :: DisplayRole).

Затем вы можете использовать такие вещи, как сигнал QStandardItemModel :: itemChanged (), чтобы обновить отображаемый текст элемента при его редактировании.

...