Читаем QT 4: программирование GUI на С++ полностью

В данном разделе мы увидели, как можно создавать три различные пользовательские модели. Многие модели значительно проще приведенных выше и обеспечивают соответствие один к одному между элементами и индексами модели. В самой системе Qt находятся дополнительные примеры применения архитектуры модель/представление вместе с подробной документацией.

<p>Реализация пользовательских делегатов</p></span><span>

Воспроизведение и редактирование в представлениях отдельных элементов выполняются с помощью делегатов. В большинстве случаев возможности делегата, предоставляемого представлением по умолчанию, оказываются достаточными. Если нам требуется более тонкое управление воспроизведением элементов, мы сможем этого добиться, просто используя пользовательскую модель: при переопределении функции data можем предусмотреть обработку ролей Qt::FontRole, Qt::TextAlignmentRole, Qt::TextColorRole и Qt::BackgroundColorRole, а также тех, которые используются делегатом по умолчанию. Например, в приведенных выше приложениях Города и Курсы валют мы применяли Qt::TextAlignmentRole для выравнивания чисел вправо.

Если нам требуется еще больший контроль, можем создать наш собственный класс делегата и связать его с нужными нам представлениями. В показанном ниже диалоговом окне Редактор фонограмм (Track Editor) используется пользовательский делегат. В этом окне отображаются названия музыкальных фонограмм и их длительность. Данные в модели будут представлены просто строками QString (названия) и значениями типа int (секунды), однако длительность будет разбита на минуты и секунды, а ее редактирование будет выполняться, используя QTimeEdit.

Рис. 10.15. Приложение Редактор фонограмм.

Диалоговое окно Редактор фонограмм использует QTableWidget — удобный подкласс отображения элементов, который работает с объектами QTableWidgetltem. Данные представлены в виде списка фонограмм Track:

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 }

Конструктор создает табличный виджет и, вместо того чтобы просто использовать делегата по умолчанию, связывает виджет с нашим пользовательским делегатом TrackDelegate, передавая ему номер столбца, содержащего временные данные. Мы начинаем с установки заголовков столбцов и затем проходим в цикле по всем данным, устанавливая для каждой строки название фонограммы и ее длительность.

В остальной части конструктора и диалогового окна TrackEditor нет ничего необычного, поэтому теперь рассмотрим класс trackDelegate, который обеспечивает воспроизведение и редактирование данных фонограммы.

01 class TrackDelegate : public QItemDelegate

02 {

03 Q_OBJECT

04 public:

05 TrackDelegate(int durationColumn, QObject *parent = 0);

06 void paint(QPainter *painter, const

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже