Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

Внутри слота

somethingClicked
мы модифицируем текст метки при щелчке по любому переключателю или флажку. В данном случае выводится имя класса объекта, который испустил сигнал, приведший к вызову слота.

Если встроенных виджетов недостаточно, то Qt предоставляет мощную систему рисования для создания собственных. В листинге 12.17 приведен небольшой пример, иллюстрирующий малую часть возможностей.

Листинг 12.17. Нестандартный виджет TimerClock

require 'Qt'

class TimerClock < Qt::Widget

 def initialize(parent = nil)

super(parent)

@timer = Qt::Timer.new(self)

connect(@timer, SIGNAL('timeout'), self, SLOT('update'))

@timer.start(25)

setWindowTitle('Stop Watch')

resize(200, 200)

 end

 def paintEvent(e)

fastHand = Qt::Polygon.new([Qt::Point.new(7, 8),

Qt::Point.new(-7, 8),

Qt::Point.new(0, -80)])

secondHand = Qt::Polygon.new([Qt::Point.new(7, 8),

Qt::Point.new(-7, 8),

Qt::Point.new(0, -65)])

secondColor = Qt::Color.new(100, 0, 100)

fastColor = Qt::Color.new(0, 150, 150, 150)

side = [width, height].min

time = Qt::Time.currentTime

painter = Qt::Painter.new(self)

painter.renderHint = Qt::Painter::Antialiasing

painter.translate(width / 2, height / 2)

painter.scale(side / 200.0, side / 200.0)

painter.pen = Qt::NoPen

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

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
. Когда виджет собирается перерисовать себя (то есть при срабатывании таймера), он вызывает этот метод. Переопределяя его, мы решаем, как виджет должен отображаться на экране. Код этого метода вызывает различные графические примитивы рисования.

  • Читать дальше
  • 1
  • ...
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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