QListWidget или QListView с QItemDelegate?

Скажем, мне нужно отобразить список элементов. Каждый элемент содержит QPushButton изображение и некоторый текст. Когда пользователь нажимает кнопку, что-то должно произойти (т.е. мне нужно получить сигнал). Каков правильный способ реализовать это в Qt?

После некоторого чтения я понимаю, что если я использую QListWidget и QListWidgetItem, это может быть достигнуто. Я могу подклассировать каждый QListWidgetItem в соответствии с моими потребностями и установить их в виджет списка.

Однако я также читал, что более подходящий подход (подход MODEL View) заключается в использовании QlistView в сочетании с QItemDelegate. Но если я использую QItemDelegate, кажется, что я могу только рисовать виджеты. Как я могу получить событие кнопки?

Извините за этот огромный пост. Я немного смущен всей концепцией использования QListWidget/QListView.

Ответы

Ответ 1

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

С QListWidget и связанным с ним классом QListWidgetItem вы можете, например, вставлять и удалять элементы очень легко. Но если вы вставляете QPushButtons, то вы не можете использовать это, чтобы вы могли просто использовать QListView и его (унаследованные) методы для установки виджета для данного индекса.

Что касается сигнала, так как вы создадите QPushButton s, просто используйте

QObject::connect(my_button, SIGNAL(clicked()),...) 

чтобы справиться с этим.

Ответ 2

Чтобы отличить от ответа Matt, кажется, вы можете использовать свой собственный виджет на QListWidgetItem, как указано в этом сообщении на qt-project.org: http://qt-project.org/forums/viewthread/17953.

Это может быть полезно, если у вас есть только несколько элементов для отображения и не заинтересованы в том, чтобы приготовить класс модели.