Программирование на языке Ruby.

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.

Программирование на языке Ruby.

Рис. 12.8. Простой редактор в Qt.

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

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

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

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

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