QT 4: программирование GUI на С++
Шрифт:
При изменении пользователем текста в строке редактирования вызывается слот главного окна regExpChanged. В этом слоте выполняется синтаксический анализ введенного пользователем текста, и парсер возвращает указатель
Мы не показываем класс RegExpParser, потому что он не имеет отношения к графическому интерфейсу или программированию модели/представления. Полный исходный код для этого примера находится на компакт-диске.
В данном разделе мы увидели, как можно создавать три различные пользовательские модели. Многие модели значительно проще приведенных выше и обеспечивают соответствие один к одному между элементами и индексами модели. В самой системе Qt находятся дополнительные примеры применения архитектуры модель/представление вместе с подробной документацией.
Реализация пользовательских делегатов
Воспроизведение и редактирование в представлениях отдельных элементов выполняются с помощью делегатов. В большинстве случаев возможности делегата, предоставляемого представлением по умолчанию, оказываются достаточными. Если нам требуется более тонкое управление воспроизведением элементов, мы сможем этого добиться, просто используя пользовательскую модель: при переопределении функции data можем предусмотреть обработку ролей Qt::FontRole, Qt::TextAlignmentRole, Qt::TextColorRole и Qt::BackgroundColorRole, а также тех, которые используются делегатом по умолчанию. Например, в приведенных выше приложениях Города и Курсы валют мы применяли Qt::TextAlignmentRole для выравнивания чисел вправо.
Если нам требуется еще больший контроль, можем создать наш собственный класс делегата и связать его с нужными нам представлениями. В показанном ниже диалоговом окне Редактор фонограмм (Track Editor) используется пользовательский делегат. В этом окне отображаются названия музыкальных фонограмм и их длительность. Данные в модели будут представлены просто строками QString (названия) и значениями типа int (секунды), однако длительность будет разбита на минуты и секунды, а ее редактирование будет выполняться, используя QTimeEdit.
Рис. 10.15. Приложение Редактор фонограмм.
Диалоговое окно Редактор фонограмм использует QTableWidget — удобный подкласс отображения элементов, который работает с объектами QTableWidgetltem. Данные представлены в виде списка фонограмм Track:
Ниже
Конструктор создает табличный виджет и, вместо того чтобы просто использовать делегата по умолчанию, связывает виджет с нашим пользовательским делегатом TrackDelegate, передавая ему номер столбца, содержащего временные данные. Мы начинаем с установки заголовков столбцов и затем проходим в цикле по всем данным, устанавливая для каждой строки название фонограммы и ее длительность.
В остальной части конструктора и диалогового окна TrackEditor нет ничего необычного, поэтому теперь рассмотрим класс trackDelegate, который обеспечивает воспроизведение и редактирование данных фонограммы.