В данном разделе мы увидели, как можно создавать три различные пользовательские модели. Многие модели значительно проще приведенных выше и обеспечивают соответствие один к одному между элементами и индексами модели. В самой системе Qt находятся дополнительные примеры применения архитектуры модель/представление вместе с подробной документацией.
Реализация пользовательских делегатов
Воспроизведение и редактирование в представлениях отдельных элементов выполняются с помощью делегатов. В большинстве случаев возможности делегата, предоставляемого представлением по умолчанию, оказываются достаточными. Если нам требуется более тонкое управление воспроизведением элементов, мы сможем этого добиться, просто используя пользовательскую модель: при переопределении функции
Если нам требуется еще больший контроль, можем создать наш собственный класс делегата и связать его с нужными нам представлениями. В показанном ниже диалоговом окне Редактор фонограмм (Track Editor) используется пользовательский делегат. В этом окне отображаются названия музыкальных фонограмм и их длительность. Данные в модели будут представлены просто строками
Диалоговое окно Редактор фонограмм использует
01 class Track
02 {
03 public:
04 Track(const QString &title = "", int duration = 0);
05 QString title;
06 int duration;
07 };
Ниже приводится фрагмент конструктора, показывающий, как создается и пополняется табличный виджет:
01 TrackEditor::TrackEditor(QList *tracks, QWidget *parent)
02 : QDialog(parent)
03 {
04 this->tracks = tracks;
05 tableWidget = new QTableWidget(tracks->count(), 2);
06 tableWidget->setItemDelegate(new TrackDelegate(1));
07 tableWidget->setHorizontalHeaderLabels(
08 QStringList() << tr("Track") << tr("Duration"));
09 for (int row = 0; row < tracks->count(); ++row) {
10 Track track = tracks->at(row);
11 QTableWidgetltem *item0 = new QTableWidgetItem(track.titie);
12 tableWidget->setItem(row, 0, item0);
13 QTableWidgetltem *item1 = new QTableWidgetItem(
14 QString::number(track.duration));
15 item1->setTextAlignment(Qt::AlignRight);
16 tableWidget->setItem(row, 1, item1);
17 }
18 …
19 }
Конструктор создает табличный виджет и, вместо того чтобы просто использовать делегата по умолчанию, связывает виджет с нашим пользовательским делегатом
В остальной части конструктора и диалогового окна
01 class TrackDelegate : public QItemDelegate
02 {
03 Q_OBJECT
04 public:
05 TrackDelegate(int durationColumn, QObject *parent = 0);
06 void paint(QPainter *painter, const