Реализация пользовательских делегатов

Воспроизведение и редактирование в представлениях отдельных элементов вы­полняются с помощью делегатов. В большинстве случаев возможности делегата, предоставляемого представлением по умолчанию, оказываются достаточными. Если нам требуется более тонкое управление воспроизведением элементов, мы сможем этого добиться, просто используя пользовательскую модель: при переопределении функции 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);


<< назад вперед >>