Вход/Регистрация
Программирование на языке 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
.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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