Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

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

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

07 QStyleOptionViewItem &option,

08 const QModelIndex &index) const;

09 QWidget *createEditor(QWidget *parent,

10 const QStyleOptionViewItem &option,

11 const QModelIndex &index) const;

12 void setEditorData(QWidget *editor,

13 const QModelIndex &index) const;

14 void setModelData(QWidget *editor,

15 QAbstractItemModel *model,

  • Читать дальше
  • 1
  • ...
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: