Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

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

Шрифт:

16 const QModelIndex &index) const;

17 private slots:

18 void commitAndCloseEditor;

19 private:

20 int durationColumn;

21 };

Мы используем QItemDelegate в качестве нашего базового класса, чтобы можно было воспользоваться возможностями делегата по умолчанию. Так же мы могли бы использовать QAbstractItemDelegate, если бы хотели начать с чистого листа. Для обеспечения в делегате возможности редактирования данных мы должны реализовать

функции createEditor, setEditorData и setModelData. Кроме того, реализуем функцию paint для изменения отображения столбца длительностей.

01 TrackDelegate::TrackDelegate(int durationColumn, QObject *parent)

02 : QItemDelegate(parent)

03 {

04 this->durationColumn = durationColumn;

05 }

Параметр конструктора durationColumn указывает делегату, какой номер столбца содержит длительность фонограммы.

01 void TrackDelegate::paint(QPainter *painter,

02 const QStyleOptionViewItem &option,

03 const QModelIndex &index) const

04 {

05 if (index.column == durationColumn) {

06 int secs = index.model->data(index, Qt::DisplayRole).toInt;

07 QString text= QString("%1:%2")

08 .arg(secs/60, 2, 10, QChar('0'))

09 .arg(secs % 60, 2, 10, QChar('0'));

10 QStyleOptionViewItem myOption = option;

11 myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;

12 drawDisplay(painter, myOption, myOption.rect, text);

13 drawFocus(painter, myOption, myOption.rect);

14 } else {

15 QItemDelegate::paint(painter, option, index);

16 }

17 }

Поскольку мы собираемся отображать длительность в виде «минуты : секунды», мы переопределили функцию paint. Вызов arg принимает целое число, выводимое в виде строки, допустимое количество символов в строке, основание целого числа (10 для десятичного числа) и символ—заполнитель.

Для выравнивания текста вправо копируем текущие опции стиля и заменяем установленное по умолчанию выравнивание. После этого вызываем QItemDelegate::drawDisplay для вывода текста, затем вызываем QItemDelegate::drawFocus для прорисовки фокусного прямоугольника в том случае, если данный элемент получил фокус, и ничего не делая в противном случае. Функцией drawDisplay очень удобно пользоваться, особенно совместно с нашими собственными опциями стиля. Мы могли бы также рисовать, используя рисовальщик непосредственно.

01 QWidget *TrackDelegate::createEditor(QWidget *parent,

02 const QStyleOptionViewItem &option,

03 const QModelIndex &index) const

04 {

05 if (index.column == durationColumn) {

06 QTimeEdit *timeEdit = new QTimeEdit(parent);

07 timeEdit->setDisplayFormat("mm:ss");

08 connect(timeEdit, SIGNAL(editingFinished),

09 this, SLOT(commitAndCloseEditor));

10 return timeEdit;

11 } else {

12 return QItemDelegate::createEditor(parent, option, index);

13 }

14 }

Мы

собираемся управлять редактированием только длительностей фонограмм, предоставляя делегату по умолчанию управление редактированием названий фонограмм. Это обеспечивается проверкой столбца, для которого запрашивается редактирование. Если это столбец длительности, создаем объект QTimeEdit, устанавливаем соответствующий формат отображения и соединяем его сигнал editingFinished с нашим слотом commitAndCloseEditor. Для других столбцов передаем управление редактированием делегату по умолчанию.

01 void TrackDelegate::commitAndCloseEditor

02 {

03 QTimeEdit *editor = qobject_cast<QTimeEdit *>(sender);

04 emit commitData(editor);

05 emit closeEditor(editor);

06 }

Если пользователь нажимает клавишу Enter или убирает фокус из QTimeEdit (но не путем нажатия клавиши Esc), генерируется сигнал editingFinished и вызывается слот commitAndCloseEditor. Этот слот генерирует сигнал commitData для уведомления представления о том, что имеются новые данные для замены существующих. Он также генерирует сигнал closeEditor для уведомления представления о том, что редактор больше не нужен, и модель его удалит. Получить доступ к редактоpy можно с помощью функции QObject::sender, которая возвращает объект, выдавший сигнал, запустивший данный слот. Если пользователь отказывается от работы с редактором (нажимая клавишу Esc), представление просто удалит этот редактор.

01 void TrackDeIegate::setEditorData(QWidget *editor,

02 const QModelindex &index) const

03 {

04 if (index.column == durationColumn) {

05 int secs = index.model->data(index, Qt::DisplayRole).toInt;

06 QTimeEdit *timeEdit = qobject_cast<QTimeEdit *>(editor);

07 timeEdit->setTime(QTime(0, secs / 60, secs % 60));

08 } else {

09 QItemDelegate::setEditorData(editor, index);

10 }

11 }

Когда пользователь инициирует редактирование, представление вызывает createEditor для создания редактора и затем setEditorData для инициализации редактора текущими данными элемента. Если редактор вызывается для столбца длительности, получаем из данных элемента длительность фонограммы в секундах и устанавливаем значение QTimeEdit на соответствующее количество минут и секунд; в противном случае мы позволяем делегату по умолчанию выполнить инициализацию.

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

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Изменяющий-Механик. Компиляция. Книги 1-18

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Государь

Кулаков Алексей Иванович
3. Рюрикова кровь
Фантастика:
мистика
альтернативная история
историческое фэнтези
6.25
рейтинг книги
Государь

Отход

Видум Инди
4. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Отход

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга IV

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Кодекс Охотника. Книга XVIII

Винокуров Юрий
18. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVIII

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Мистика

Гейман Нил
Детективы:
классические детективы
исторические детективы
7.29
рейтинг книги
Мистика

Родословная. Том 5

Ткачев Андрей Юрьевич
5. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 5

Кодекс Охотника. Книга XXXVI

Винокуров Юрий
36. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVI

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.00
рейтинг книги
Дважды одаренный. Том V