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

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(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(editor);

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

08 } else {

09 QItemDelegate::setEditorData(editor, index);

10 }

11 }

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

01 void TrackDelegate::setModelData(QWidget *editor,

02 QAbstractItemModel *model, const QModelIndex &index) const

03 {

04 if (index.column == durationColumn) {

05 QTimeEdit *timeEdit = qobject_cast(editor);

06 QTime time = timeEdit->time;

07 int secs = (time.minute * 60) + time.second;

08 model->setData(index, secs);

09 } else {

10 QItemDelegate::setModelData(editor, model, index);

11 }

12 }

Если пользователь прекращает редактирование (например, щелкнув левой кнопкой мышки за пределами виджета редактора или нажав клавишу Enter или Tab), а не отменяет его, модель должна быть обновлена данными редактора. Если редактировалась длительность, извлекаем минуты и секунды из QTimeEdit и устанавливаем поле данных на соответствующее значение секунд.

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