Как представить сложный виджет в объекте структурного вида в QT?

У меня есть следующая проблема с платформой модели/представления QT. Я хочу представить виджет в объекте табличного представления.

Сначала моя мысль состояла в том, чтобы использовать

void QAbstractItemView::setIndexWidget( const QModelIndex & index, QWidget * widget )

Но документация для этой функции явно указывает:

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

Таким образом, они предлагают использовать делегатов здесь. Ну, пока неплохо. Я знаю, что делегаты могут использоваться для создания редактора, который может быть в основном любым спокойным виджетом. Но вот проблема - я не хочу, чтобы этот виджет был редактором - я хочу представить объект с этим виджетом всегда. И не только "представляют", мне нужен он, чтобы иметь точное поведение виджета.

Теперь виджет, который я хочу использовать, является пользовательским виджетом, который является контейнером некоторых других виджетов (немного флажков, немного кнопок с некоторым расположением).

Решение, которое я рассматриваю, похоже на это:

  1. Захватите вид моего пользовательского виджета к пиксельной карте.
  2. Позвольте делегату нарисовать себя с помощью этой пиксельной карты.
  3. Когда мышь является по причине объекта представлением, чтобы автоматически начать редактировать (я не делаю
    знайте, как сделать это все же, но я предполагаю, что это возможно),
  4. Позвольте делегату создать мой виджет как редактору для объекта.

Это решение, кажется, работает, но оно плохо пахнет для меня. Может кто-либо вещь о более изящном решении для этой проблемы?

Спасибо.

9
задан Lev 26 January 2010 в 09:53
поделиться

1 ответ

Делегаты отвечают за создание редакторов , а также за всю необходимую индикацию. Они могут использовать стили, чтобы сделать большую часть картины, например, нарисовать прогресс-бар или закрасить вручную.

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

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

У вас есть некоторый контроль при вызове редактора с помощью триггеров редактирования , хотя вы определенно можете справиться с этим с помощью некоторого пользовательского кода, например, с помощью отслеживания мыши.

7
ответ дан 3 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

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