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

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

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.

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

Оглавление книги


Генерация: 0.039. Запросов К БД/Cache: 0 / 2
поделиться
Вверх Вниз