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

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

Жанры

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

end

app = Qt::Application.new(ARGV)

widget = MyWidget.new

widget.show

app.exec

Рис.12.7. Кнопки в Qt

В этом примере мы создали собственный класс виджета с именем

MyWidget
, он наследует классу
Qt::Widget
, являющемуся предком любого нестандартного
виджета.

Перед инициализацией мы подготовили список слотов, которые будут определены в нашем классе. Слоты — это обычные методы класса, но необходимо указать их имена, чтобы во время выполнения QtRuby знала, что мы собираемся использовать их именно в качестве слотов. Метод класса

slots
принимает список строк:

slots = 'slot1', 'slot2'

Инициализатор класса принимает аргумент

parent
, он есть почти у всех виджетов в Qt и определяет, какой виджет будет владельцем вновь создаваемого. Значение
nil
означает, что это «виджет верхнего уровня», у которого нет владельца. Концепция «владения», наверное, имеет более понятный смысл в C++; родители владеют своими детьми, то есть при уничтожении или удалении родителя удаляются и все его потомки.

Наш класс создает объект

Qt::LineEdit
для ввода текста и кнопку
Qt::PushButton
с надписью
All Caps!
. В качестве родителя каждому виджету передается self. Это означает, что создаваемый экземпляр
MyWidget
«усыновляет» эти виджеты.

Далее мы обращаемся к ключевой части библиотеки Qt — механизму соединения сигналов со слотами. В классе

Qt::Pushbutton
определен сигнал
clicked
, который испускается при нажатии кнопки. Этот сигнал можно соединить со слотом, в данном случае с методом
buttonClickedSlot
. Имя слота может быть любым, суффикс
Slot
мы употребили просто для наглядности.

В самом конце мы создаем экземпляр класса

Qt::HBoxLayout
. При добавлении виджетов в этот контейнер он автоматически изменяет их размеры, так что нам больше не о чем беспокоиться.

12.4.4. Текстовые поля

Как видно из листинга 12.14, в QtRuby есть класс

Qt::LineEdit
для ввода одной строки текста. Для ввода нескольких строк предназначен класс
Qt::TextEdit
.

В листинге 12.15 демонстрируется многострочное текстовое поле. Под ним расположена метка, в которой отображается текущая длина текста (рис. 12.8).

Листинг 12.15. Простой редактор в Qt

require 'Qt'

class MyTextWindow < Qt::Widget

 slots 'theTextChanged'

 def initialize(parent = nil)

super(parent)

@textedit = Qt::TextEdit.new(self)

@textedit.setWordWrapMode(Qt::TextOption::WordWrap)

@textedit.setFont( Qt::Font.new("Times", 24) )

@status = Qt::Label.new(self)

box = Qt::VBoxLayout.new

box.addWidget(@textedit)

box.addWidget(@status)

setLayout(box)

@textedit.insertPlainText("This really is an editor")

connect(@textedit, SIGNAL('textChanged'),

self, SLOT('theTextChanged'))

 end

 def theTextChanged

text = "Length: " + @textedit.toPlainText.length.to_s

@status.setText(text)

 end

end

app = Qt:Application.new(ARGV)

widget = MyTextWindow.new

widget.setWindowTitle("QtRuby Text Editor")

widget.show

app.exec

Рис. 12.8.

Простой редактор в Qt

Виджет конструируется примерно так же, как в предыдущем примере. Но теперь мы создаем объект

Qt::TextEdit
, а также метку
Qt::Label
для показа текущего состояния.

Стоит отметить, что для объекта

@textedit
мы указали шрифт Times высотой 24 пункта. У каждого класса, наследующего
Qt::Widget
(в том числе и у
Qt::TextEdit
) есть свойство
font
, которое можно опросить или установить.

Затем мы создаем менеджер вертикального размещения (

Qt::QBoxLayout
), который будет контейнером для всех своих потомков, добавляем в него виджет
@textedit
и связываем сигнал
textChanged
с определенным нами слотом
theTextChanged
.

В методе

theTextChanged
мы запрашиваем у редактора текст и получаем его длину, а затем записываем возвращенное значение в метку
@status
.

Отметим, что весь механизм сигналов и слотов работает асинхронно. После того как приложение входит в цикл обработки событий (

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

12.4.5. Прочие виджеты

В библиотеке Qt есть еще много встроенных виджетов, например переключатели, флажки и т.п. В листинге 12.16 продемонстрированы некоторые из них, а на рис. 12.9 показано, как выглядит окно приложения.

Листинг 12.16. Прочие виджеты в Qt

require 'Qt'

class MyWindow < Qt::Widget

 slots 'somethingClicked(QAbstractButton *)'

 def initialize(parent = nil)

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

Корона Тафелона

Авербух Наталья Владимировна
3. Ведьмина дорога
Фантастика:
фэнтези
5.00
рейтинг книги
Корона Тафелона

Некромант . Трилогия

Петерсон Андрей Викторович
Перстень некромансера
Фантастика:
фэнтези
7.64
рейтинг книги
Некромант . Трилогия

Будаг — мой современник

Велиев Али Кара оглы
Проза:
советская классическая проза
5.00
рейтинг книги
Будаг — мой современник

Искатель, 2011 №5

Юдин Александр Валентинович
388. Искатель
Приключения:
прочие приключения
5.00
рейтинг книги
Искатель, 2011 №5

Собрание сочинений. Том 45

Энгельс Фридрих
Научно-образовательная:
философия
5.00
рейтинг книги
Собрание сочинений. Том 45

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Ермак. Регент

Сёгун

Клавелл Джеймс
Азиатская сага
Приключения:
исторические приключения
прочие приключения
9.41
рейтинг книги
Сёгун

Тот, кто знает. Книга вторая. Перекресток

Маринина Александра
1. Преступления правильной жизни
Детективы:
прочие детективы
7.91
рейтинг книги
Тот, кто знает. Книга вторая. Перекресток

3ds Max 2008. Секреты мастерства

Верстак Владимир
Компьютеры и Интернет:
программное обеспечение
5.00
рейтинг книги
3ds Max 2008. Секреты мастерства

Справедливость для всех

Николаев Игорь Игоревич
6. Ойкумена
Фантастика:
эпическая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Справедливость для всех

Разбуди в себе исполина

Роббинс Энтони
Научно-образовательная:
психология
5.00
рейтинг книги
Разбуди в себе исполина

1001 заговор сибирской целительницы / Наталья Ивановна Степанова

Степанова Наталья Ивановна
Дом и Семья:
прочее домоводство
7.86
рейтинг книги
1001 заговор сибирской целительницы / Наталья Ивановна Степанова

Кровь, слезы и лавры

Пикуль Валентин Саввич
Исторические миниатюры
Проза:
историческая проза
5.00
рейтинг книги
Кровь, слезы и лавры

Последний реанорец. Том V

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