QT 4: программирование GUI на С++
Шрифт:
Конструктор создает табличный виджет и, вместо того чтобы просто использовать делегата по умолчанию, связывает виджет с нашим пользовательским делегатом TrackDelegate, передавая ему номер столбца, содержащего временные данные. Мы начинаем с установки заголовков столбцов и затем проходим в цикле по всем данным, устанавливая для каждой строки название фонограммы и ее длительность.
В остальной
Мы используем QItemDelegate в качестве нашего базового класса, чтобы можно было воспользоваться возможностями делегата по умолчанию. Так же мы могли бы использовать QAbstractItemDelegate, если бы хотели начать с чистого листа. Для обеспечения в делегате возможности редактирования данных мы должны реализовать функции createEditor, setEditorData и setModelData. Кроме того, реализуем функцию paint для изменения отображения столбца длительностей.
Параметр конструктора durationColumn указывает делегату, какой номер столбца содержит длительность фонограммы.
Поскольку
мы собираемся отображать длительность в виде «минуты : секунды», мы переопределили функцию paint. Вызов arg принимает целое число, выводимое в виде строки, допустимое количество символов в строке, основание целого числа (10 для десятичного числа) и символ—заполнитель.Для выравнивания текста вправо копируем текущие опции стиля и заменяем установленное по умолчанию выравнивание. После этого вызываем QItemDelegate::drawDisplay для вывода текста, затем вызываем QItemDelegate::drawFocus для прорисовки фокусного прямоугольника в том случае, если данный элемент получил фокус, и ничего не делая в противном случае. Функцией drawDisplay очень удобно пользоваться, особенно совместно с нашими собственными опциями стиля. Мы могли бы также рисовать, используя рисовальщик непосредственно.
Мы собираемся управлять редактированием только длительностей фонограмм, предоставляя делегату по умолчанию управление редактированием названий фонограмм. Это обеспечивается проверкой столбца, для которого запрашивается редактирование. Если это столбец длительности, создаем объект QTimeEdit, устанавливаем соответствующий формат отображения и соединяем его сигнал editingFinished с нашим слотом commitAndCloseEditor. Для других столбцов передаем управление редактированием делегату по умолчанию.
Если пользователь нажимает клавишу Enter или убирает фокус из QTimeEdit (но не путем нажатия клавиши Esc), генерируется сигнал editingFinished и вызывается слот commitAndCloseEditor. Этот слот генерирует сигнал commitData для уведомления представления о том, что имеются новые данные для замены существующих. Он также генерирует сигнал closeEditor для уведомления представления о том, что редактор больше не нужен, и модель его удалит. Получить доступ к редактоpy можно с помощью функции QObject::sender, которая возвращает объект, выдавший сигнал, запустивший данный слот. Если пользователь отказывается от работы с редактором (нажимая клавишу Esc), представление просто удалит этот редактор.