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

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

Жанры

Программирование на языке 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. Простое приложение Tk

В этом классе мы сначала создаем объект

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)

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

Мечников. Открытие века

Алмазов Игорь
4. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Мечников. Открытие века

Прайм. Хомори

Бор Жорж
2. Легенда
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Прайм. Хомори

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Студиозус 2

Шмаков Алексей Семенович
4. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус 2

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

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

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

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

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

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Локки 9. Потомок бога

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

Гримуар темного лорда III

Грехов Тимофей
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда III

Как я строил магическую империю 5

Зубов Константин
5. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 5

Я - злодейка в дораме. Сезон второй

Вострова Екатерина
2. Выжить в дораме
Фантастика:
уся
фэнтези
сянься
попаданцы
5.00
рейтинг книги
Я - злодейка в дораме. Сезон второй

Как я строил магическую империю

Зубов Константин
1. Как я строил магическую империю
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю

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

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

Бастард Императора. Том 3

Орлов Андрей Юрьевич
3. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 3