QTableWidget подходит когда надо использовать иконки в таблице. На картинке видно, что изображения имеет подходящий размер и выглядят прилично.
Обратите сразу внимание, что 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 выделение делается цветом из палитры приложения, которое устанавливается из операционно системы. А нам хочется сделать одинаковым цветом и что делать?
Ответ кстати простой - цвет выбора можно узнать так:
QApplication::palette().highlight().color().name();
Внизу прикреплен проект заготовка для тестирования QTableWidget:
Файлы для скачивания
*
тестируем QTableWidget на Qt 4.8.1