@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 показано, как выглядит окно приложения.
require 'Qt'
class MyWindow < Qt::Widget
slots 'somethingClicked(QAbstractButton *)'
def initialize(parent = nil)
super(parent)
groupbox = Qt::GroupBox.new('Some Radio Button',self)
radio1 = Qt::RadioButton.new('Radio Button 1', groupbox)
radio2 = Qt::RadioButton.new('Radio Button 2', groupbox)
check1 = Qt::CheckBox.new('Check Box 1', groupbox)
vbox = Qt::QBoxLayout.new
vbox.addWidget(radio1)
vbox.addWidget(radio2)
vbox.addWidget(check1)
groupbox.setLayout(vbox)
bg = Qt::ButtonGroup.new(self)
bg.addButton(radio1)
bg.addButton(radio2)
bg.addButton(check1)
connect(bg, SIGNAL('buttonClicked(QAbscractButton *)'),
self, SLOT('somethingClicked(QAbstractButton *)') )
@label = Qt::Label.new(self)
vbox = Qt::VBoxLayout.new
vbox.addWidget(groupbox)
vbox.addWidget(@label)
setLayout(vbox)
end
def somethingClicked(who)
@label.setText('You clicked on a ' + who.className)
end
end
app = Qt::Application.new(ARGV)
widget = MyWindow.new
widget.show
app.exec
Рис. 12.9. Простое приложение Tk
В этом классе мы сначала создаем объект Qt::GroupBox
— контейнер с рамкой и необязательным заголовком, в который можно помещать другие виджеты. Далее создаются два переключателя Qt::RadioButtons
и флажок Qt::CheckBox
, а в качестве их родителя указывается ранее созданный контейнер.
Затем создается менеджер размещения Qt::VBoxLayout
, в который помещаются переключатели и флажок, после чего этот менеджер связывается с групповым контейнером и начинает управлять его размещением на экране.
Следующий важный шаг — создание объекта Qt::ButtonGroup
, в который помещаются