QTableWidget (QTableModel)

QTableWidget подходит когда надо использовать иконки в таблице. На картинке видно, что изображения имеет подходящий размер и выглядят прилично.

фотка 1

Обратите сразу внимание, что QTableWidget наследуется от QTableView

class Q_GUI_EXPORT QTableWidget : public QTableView

Также надо сразу обратить внимание, что модель данных QTableModel встроена (инкапсулирована) в класс QTableWidget, а именно в его приватную часть QTableWidgetPrivate:

class QTableModel : public QAbstractTableModel 

То есть получается, что  QTableWidget наследуется от QTableView, но модель данных не внешне подключаемая (по умолчанию), а встроенная.

Когда мы делаем setItem :

ui->tbl->setItem( row, 0, new QTableWidgetItem("111") );

мы используем встроенную приватную модель данных
d->tableModel()->setItem(row, column, item); а именно QTableModel

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

Для этого похоже предусмотрены специальные функции, которые добавляют QTableWidgetItem в ячейки, по индексам row/column.

Работают setData для ролей Qt::UserRole... То есть для каждой ячейки можно сохранять дополнительно неограниченное количество информации.

Что вызывает иногда трудности? Например как программно выделить строку в QTableWidget. Ответ очень не тривиальный. В отличии от QTableView сработает выделение только если установить стили css:

QTableWidget::item:selected{
 background:blue;
}

Далее вы можете использовать разные вариации какие именно ячейки выделить:

ui->tbl->setItemSelected( ui->tbl->item(0, 0) , true);

ui->tbl->selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);

ui->tbl->selectionModel()->select(index , QItemSelectionModel::Select);

ui->tbl->setRangeSelected( QTableWidgetSelectionRange( 0, 0, 0, 1 ), true );

ui->tbl->selectRow(0);

Любой вариант заработает, но только при определении стиля QTableWidget::item:selected ! Почему - до сих пор непонятно и лень разбираться. Примечание: Qt 4.8.1.

На картинке: объект слева QTableView и справа QTableWidget. Выделение  строки 1 у QTableWidget через стили задано яным указанием цвета. А вот у QTableView выделение делается цветом из палитры приложения, которое устанавливается из операционно системы. А нам хочется сделать одинаковым цветом и что делать?

фотка 2

Ответ кстати простой - цвет выбора можно узнать так:

QApplication::palette().highlight().color().name();

Внизу прикреплен проект заготовка для тестирования QTableWidget:

фотка 3

Файлы для скачивания

* QTableWidget_QTableModel [zip]
тестируем QTableWidget на Qt 4.8.1