Реализация пользовательских делегатов
Воспроизведение и редактирование в представлениях отдельных элементов выполняются с помощью делегатов. В большинстве случаев возможности делегата, предоставляемого представлением по умолчанию, оказываются достаточными. Если нам требуется более тонкое управление воспроизведением элементов, мы сможем этого добиться, просто используя пользовательскую модель: при переопределении функции data() мож,ем предусмотреть обработку ролей Qt:: FontRole, Qt:: TextAlign-mentRole, Qt: :TextColorRole и Qt: :BackgroundColorRole, а также тех, которые используются делегатом по умолчанию. Например, в приведенных выше приложениях Города и Курсы валют мы применяли Qt: :TextAlignmentRole для выравнивания чисел вправо.
Если нам требуется еще больший контроль, можем создать наш собственный класс делегата и связать его с нужными нам представлениями. В показанном ниже диалоговом окне 'Редактор фонограмм (Track Editor) используется пользовательский делегат. В этом окне отображаются названия музыкальных фонограмм и их длительность. Данные в модели будут представлены просто строками QString (названия) и значениями типа int (секунды), однако длительность будет разбита на минуты и секунды, а ее редактирование будет выполняться, используя QTimeEdit.

Рис. 10.15. Приложение Редактор фонограмм
Диалоговое окно Редактор фонограмм использует QTableWidget - удобный подкласс отображения элементов, который работает с объектами QTableWidgetltem. Данные представлены в виде списка фонограмм Track:
class Track {
public:
Track(const QString &title = "", int duration = 0);
QString title; int duration;
};
Ниже приводится фрагмент конструктора, показывающий, как создается и пополняется табличный виджет:
TrackEditor::TrackEditor(QList<Track> *tracks, QWidget *parent) : QDialog(parent)
{
this->tracks = tracks;
tableWidget = new QTableWidget(tracks->count(), 2); tableWidget->setItemDelegate(new TrackDelegate(1)); tableWidget->setHorizontalHeaderLabels(
QStringList,) « tr("Track") « tr("Duration"));
for (int row = 0; row < tracks->count(); ++row) {
Track track = tracks->at(row);
QTableWidgetltem *item0 « pew QTableWidgetltem(track.title); tableWidget->setItem(row, 0, itemO);
<< назад вперед >>