ncix
@ncix
Предприниматель

QItemDelegate (как сделать таблицу с виджетами)?

Всем привет


Задача у нас следующая — таблица (QTreeView) должна содержать в одном из столбцов кнопки.


Столкнулись с неприятными ограничениями MV в Qt. А именно с механизмом делегатов. Механизм позволяет делегировать редактирование стороннему виджету, но не позволяет делегировать представление стороннему виджету. Для изменения представления предлагается перекрыть виртуальный метод ::paint. Т.е. разместить произвольный виджет в ячейке таблицы (если она не редактируется в данный момент) невозможно.


Да, можно используя ::paint() отрисовать и кнопку в представлении, но чтоб ее нажать придется кликнуть дважды — сначала перейти в редактирование (тогда делегат создаст нужный редактор-кнопку) и снова нажать уже на кнопку. Решение дурацкое и неудобное. Кроме того, виджет никак не будет реагировать на наведение мышью.


Если кто-нибудь сталкивался с подобной задачей, буду очень рад вашей помощи.
  • Вопрос задан
  • 6799 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Lol4t0
Насколько я знаю, прямого решения данная проблема не имеет. А вот вариантов, как это реализовать — довольно много.

1. Использовать QML. Вот, есть пример. Но я с ним не разбирался.

2. Добавлять виджеты для каждой строки в treeView. Решение на самом деле довольно кривое, потому что сразу появляются проблемы синхронизации виджетов с моделью. Сами разработчики пишут, что
This function should only be used to display static content within the visible area corresponding to an item of data. If you want to display custom dynamic content or implement a custom editor widget, subclass QItemDelegate instead.
К тому же, есть вероятность, что при числе строк в модели порядка нескольких тысяч, все начнет тормозить.

3. Разработать полноценный делегат.
Нужно будет переопределить не только paint, но и установить eventFilter на treeView.

4. Отображать кнопки только на время редактирования, при этом можно настроить editTriggers.

5. Открывать редактор принудительно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы