Книга: Программирование на языке 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
.
Отметим, что весь механизм сигналов и слотов работает асинхронно. После того как приложение входит в цикл обработки событий (арр.ехес
), оно уже не получает управления явно. Вот почему сигналы и слоты так важны. Мы определяем события, которые нас интересуют (сигналы), и действия, которые нужно выполнить при возникновении таких событий (слоты).