QT 4: программирование GUI на С++
Шрифт:
Мы переопределяем в Ticker четыре обработчика событий, с тремя из которых мы до сих пор не встречались: timerEvent, showEvent и hideEvent.
Теперь давайте рассмотрим реализацию:
Конструктор
Функция setText ycтaнaвливaeт oтoбpaжaeмый тeкcт. Oнa вызывaeт update для выдачи запроса на перерисовку и updateGeometry для уведомления всех менеджеров компоновки, содержащих виджет Ticker, об изменении идеального размера.
Функция sizeHint возвращает в качестве идеального размера виджета размеры области, занимаемой текстом. Функция QWidget::fontMetrics возвращает объект QFontMetrics, который можно использовать для получения информации относительно шрифта виджета. В данном случае мы определяем размер заданного текста. (В первом аргументе функции QFontMetrics::size задается флажок, который не нужен для простых строк, поэтому мы просто передаем 0.)
Функция paintEvent отображает текст при помощи функции QPainter::drawText. Она использует функцию fontMetrics для определения размера области, занимаемой текстом по горизонтали, и затем выводит текст столько раз, сколько необходимо для заполнения виджета по всей его ширине, учитывая значение смещения offset.
функция showEvent
Мы могли бы функцию startTimer вызвать в конструкторе Ticker, но мы экономим некоторые ресурсы за счет генерации Qt событий таймера только в тех случаях, когда виджет действительно видим.
Функция timerEvent вызывается системой в соответствующие моменты времени. Она увеличивает смещение offset на 1 для имитации движения по всей области вывода текста. Затем она перемещает содержимое виджета на один пиксель влево при помощи фyнкции QWidget::scroll. Вполне достаточно было бы вызывать функцию update вместо scroll, но вызов функции scroll более эффективен, потому что она просто перемещает существующие на экране пиксели и генерирует событие рисования для открывшейся области виджета (которая в данном случае представляет собой полосу шириной в один пиксель).
Если событие таймера не относится к нашему таймеру, мы передаем его дальше в наш базовый класс.
Функция hideEvent вызывает QObject::killTimer для остановки таймера.
События таймера являются низкоуровневыми событиями, и если нам необходимо иметь несколько таймеров, это может усложнить отслеживание всех идентификаторов таймеров. В таких ситуациях обычно легче создавать для каждого таймера объект QTimer. QTimer генерирует через заданный временной интервал сигнал timeout. QTimer также обеспечивает удобный интерфейс для однократных таймеров (то есть таймеров, которые срабатывают только один раз).