Программирование на языке Ruby
Шрифт:
super(parent)
groupbox = Qt::GroupBox.new("Some Radio Button",self)
radio1 = Qt::RadioButton.new("Radio Button 1", groupbox)
radio2 = Qt::RadioButton.new("Radio Button 2", groupbox)
check1 = Qt::CheckBox.new("Check Box 1", groupbox)
vbox = Qt::QBoxLayout.new
vbox.addWidget(radio1)
vbox.addWidget(radio2)
vbox.addWidget(check1)
groupbox.setLayout(vbox)
bg = Qt::ButtonGroup.new(self)
bg.addButton(radio1)
bg.addButton(radio2)
bg.addButton(check1)
connect(bg, SIGNAL('buttonClicked(QAbscractButton *)'),
self, SLOT('somethingClicked(QAbstractButton *)') )
@label = Qt::Label.new(self)
vbox = Qt::VBoxLayout.new
vbox.addWidget(groupbox)
vbox.addWidget(@label)
setLayout(vbox)
end
def somethingClicked(who)
@label.setText("You clicked on a " + who.className)
end
end
app = Qt::Application.new(ARGV)
widget = MyWindow.new
widget.show
app.exec
Рис. 12.9.
В этом классе мы сначала создаем объект
Qt::GroupBox
— контейнер с рамкой и необязательным заголовком, в который можно помещать другие виджеты. Далее создаются два переключателя Qt::RadioButtons
и флажок Qt::CheckBox
, а в качестве их родителя указывается ранее созданный контейнер. Затем создается менеджер размещения
Qt::VBoxLayout
, в который помещаются переключатели и флажок, после чего этот менеджер связывается с групповым контейнером и начинает управлять его размещением на экране. Следующий важный шаг — создание объекта
Qt::ButtonGroup
, в который помещаются флажок и переключатели. Qt::ButtonGroup
предназначен для логической группировки кнопок, флажков и переключателей. На их визуальное расположение он никак не влияет, зато обеспечивает, к примеру, взаимное исключение (гарантирует, что только один из группы виджетов может быть отмечен). В данном случае этот объект будет источником сигнала buttonClicked
, который испускается при нажатии любой кнопки в группе. Этот сигнал отличается от виденных ранее тем, что ему
QAbstractButton*
— напоминает о C++-ных корнях Qt. В некоторых случаях употребления принятой в C++ нотации для обозначения типов параметров не избежать (хотя в будущих версиях это, возможно, и исправят). В результате такого вызова метода
connect
при щелчке по любому виджету, принадлежащему группе, этот виджет будет передан слоту somethingClicked
. Наконец, мы создаем метку Qt::Label
, контейнер Qt::QBoxLayout
и увязываем все вместе. Внутри слота
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)
Поделиться:
Популярные книги
Дорога Короля
Фантастика:
фэнтези
5.00
рейтинг книги
В тени завтрашнего дня
Научно-образовательная:
культурология
5.00
рейтинг книги
Законник Российской Империи
1. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
АН (цикл 11 книг)
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
Дважды одаренный. Том VI
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.50
рейтинг книги
Танцы на снегу
2. Геном
Фантастика:
научная фантастика
9.23
рейтинг книги
Точка Бифуркации XII
12. ТБ
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Место под солнцем
Анника Бенгтзон
Детективы:
криминальные детективы
6.00
рейтинг книги
Первопроходец
10. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
фэнтези
5.00
рейтинг книги
Тень в зеркале
1. Сказания трех миров
Фантастика:
фэнтези
7.38
рейтинг книги
Сексуальная жизнь мужчины. Книга 1
Дом и Семья:
образовательная литература
здоровье и красота
7.00
рейтинг книги
Шайтан Иван 6
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.50
рейтинг книги
Ангел пролетел
Любовные романы:
5.00
рейтинг книги
Найти себя
1. Магия - наше будущее. Раб из нашего времени
Фантастика:
боевая фантастика
8.08