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

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

Жанры

Программирование на языке Ruby
Шрифт:

painter.save

painter.rotate(6.0 * time.second)

painter.drawConvexPolygon(secondHand)

painter.restore

painter.pen = secondColor

(0...12).each do |i|

painter.drawLine(88, 0, 96, 0)

painter.rotate(30.0)

end

painter.pen = Qt::NoPen

painter.brush = Qt::Brush.new(fastColor)

painter.save

painter.rotate(36.0 * (time.msec / 100.0))

painter.drawConvexPolygon(fastHand)

painter.restore

painter.pen = fastColor

(0...60).each do |j|

if (j % 5) != 0

painter.drawLine(92, 0, 96, 0)

end

painter.rotate(6.0)

end

painter.end

 end

end

app = Qt::Application.new(ARGV)

wid = TimerClock.new

wid.show

app.exec

Созданный

в этом примере виджет называется
TimerClock
. В инициализаторе мы создаем объект
Qt::Timer
, который конфигурируется для периодического испускания сигнала. Его сигнал
timeout
мы соединяем со слотом
update
нашего виджета. Это встроенный слот, он заставляет виджет перерисовать себя.

Таймер запускается методом

start
. Переданный ему аргумент говорит, что таймер должен срабатывать (и испускать сигнал
timeout
) каждые 25 миллисекунд. Следовательно, слот
update
будет вызываться каждые 25 миллисекунд.

Далее определяется метод

paintEvent
. Мы переопределяем одноименный метод класса
Qt::Widget
. Когда виджет собирается перерисовать себя (то есть при срабатывании таймера), он вызывает этот метод. Переопределяя его, мы решаем, как виджет должен отображаться на экране. Код этого метода вызывает различные графические примитивы рисования.

Начиная с этого места идет сплошная геометрия. Мы создаем несколько многоугольников

Qt::Polygon
, представляющих стрелки часов. Ориентация многоугольников не имеет значения, потому что манипулировать ими мы будем позже.

Задаются значения нескольких свойств. Устанавливаются цвета

Qt::Color
обеих стрелок. Аргументами инициализатора
Qt::Color
являются значения в формате RGB с необязательной альфа-прозрачностью.

Часы должны быть квадратными, поэтому в переменную

side
(длина стороны) записывается минимум из ширины и высота виджета. Кроме того, мы запоминаем текущее время, обращаясь к методу
Qt::Time.currentTime
.

Далее создается объект

Qt::Painter
,
и с его помощью мы начинаем рисовать. Задается режим сглаживания (antialiasing), чтобы на стрелках часов не было «лесенки». Начало координат помещается в центр области рисования (
painter.translate (width/2, height/2)
). Для объекта Painter устанавливается масштаб в предположении, что сторона квадрата составляет 200 единиц. Если размер окна изменится, то масштабирование будет произведено автоматически.

Затем выполняется последовательность операций рисования. Различные геометрические преобразования (например, поворот), сопровождаются парой вызовов

painter.save
и
painter.restore
. Метод save сохраняет текущие свойства объекта
Painter
в стеке, чтобы их можно было позднее восстановить.

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

И напоследок мы сообщаем объекту

Painter
, что рисование закончилось (вызывая метод
painter.end
). Довершают картину четыре строчки, в которых создаются объект приложения
Qt::Application
и наш виджет, а затем запускается цикл обработки событий. На рис. 12.10 показан конечный результат.

Рис. 12.10. Виджет TimerClock

12.4.6. Дополнительные замечания

Поскольку библиотека Qt написана на C++, неизбежны некоторые идиомы, отражающие ограничения этого языка. Иногда перевод на Ruby не выглядит на 100% естественным, поскольку в Ruby аналогичные вещи делаются несколько иначе. Поэтому в ряде случаев вводится избыточность, позволяющая выражать свои намерения «по-рубистски».

Например, имена методов, в которых сохранена «верблюжьяНотация», свойственная C++, можно записывать и с подчерками (_). Так, следующие два вызова эквивалентны:

Qt::Widget::minimumSizeHint

Qt::Widget::minimum_size_hint

Все методы установки свойств в Qt начинаются со слова

set
, например,
Qt::Widget::setMinimumSize
. В Ruby можно это слово опускать и пользоваться присваиванием, например:

widget.setMinimumSize(50)

widget.minimumSize = 50 # To же самое.

widget.minimum_size = 50 # To же самое.

Аналогично в Qt имена методов, возвращающих булевское значение, часто начинаются с

is
или
has
, например,
Qt::Widget::isVisible
. QtRuby позволяет именовать их в духе Ruby:

а.isVisible

a.visible? # То же самое.

12.5. Другие библиотеки для создания графических интерфейсов

Мы предупреждали, что вы можете и не найти своего любимого графического интерфейса. Но напоследок кратко упомянем имеющиеся альтернативы.

Некоторые из упоминаемых продуктов еще не вполне зрелые, могут быть неполными и содержать ошибки. Но мы полагаем, что этот список будет расти, а поддерживаемые привязки со временем обретут стабильность.

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

Кондотьер

Листратов Валерий
7. Ушедший Род
Фантастика:
фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Кондотьер

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

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

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

Божья коровка 2

Дроздов Анатолий Федорович
2. Божья коровка
Фантастика:
альтернативная история
5.00
рейтинг книги
Божья коровка 2

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

На границе империй. Том 10. Часть 10

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

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI

Черный дембель. Часть 2

Федин Андрей Анатольевич
2. Черный дембель
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Черный дембель. Часть 2

Газлайтер. Том 29

Володин Григорий Григорьевич
29. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 29

Адвокат Империи 11

Карелин Сергей Витальевич
Адвокат империи
Фантастика:
городское фэнтези
альтернативная история
рпг
дорама
попаданцы
5.00
рейтинг книги
Адвокат Империи 11

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия