2009-02-09 9 views
6

У меня есть QTableView, для которого я хочу отображать последний столбец всегда в режиме редактирования. (Это QComboBox, где пользователь должен иметь возможность всегда изменять значение.)Как сообщить Qt, чтобы всегда показывать редактор в QTableView?

Я думаю, что видел решение в Qt documentation, но больше не могу его найти. Есть ли простой способ сделать это?

Я думаю, что я мог бы архивировать этот эффект, используя openPersistentEditor() для каждой ячейки, но я ищу лучший способ. (Подобно тому, как указывать его только один раз для всей колонки.)

ответ

4

Есть две возможности:

Используя setIndexWidget, но пишет Trolltech:

Эта функция должна быть использована только для отображения статического контента в пределах видимой области , соответствующей элементу данных. Если вы хотите отобразить пользовательский динамический контент или реализовать собственный виджет редактора , вместо этого следует подкласс QItemDelegate .

(И это ломает модель/представление шаблон ...)

Или с помощью a delegate's paint method. Но здесь вы должны реализовать все, как включенные/отключенные элементы самостоятельно.

0

Виртуальная функция вызывается для проверки возможности редактирования элемента (см. Qt::ItemIsEditable). Взгляните на Making the Model Editable в документации Model/View Programming.

+1

Я ищу решение не как сделать редактируемую ячейку, но и как отображать редактор все время. –

0

Я не вижу простой способ сделать это, но вы можете управлять с помощью делегата. Я, честно говоря, не знаю точно, как это будет работать, но вы сможете получить что-то, если будете стараться достаточно. Если вы получите надлежащего делегата, вы сможете установить его на весь вид, одну ячейку представления или просто столбец или строку.

3

Одним из способов получения автоматического редактирования является вызов функции setEditTriggers() в представлении с помощью значения QAbstractItemView :: AllEditTriggers.

Чтобы отобразить содержимое данного столбца определенным образом, взгляните на QAbstractItemView :: setItemDelegateForColumn(). Это позволит вам указать пользовательский делегат только для тех элементов, которые в нем нуждаются. Однако он не будет автоматически создавать виджет редактора для каждого из них (в принципе это может быть тысячи), но вы можете использовать делегат для рендеринга каждого элемента таким образом, чтобы он выглядел как виджет редактора.