Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

В методе

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

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

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

12.4.5. Прочие виджеты

В библиотеке Qt есть еще много встроенных виджетов, например переключатели, флажки и т.п. В листинге 12.16 продемонстрированы некоторые из них, а на рис. 12.9 показано, как выглядит окно приложения.

Листинг 12.16. Прочие виджеты в Qt

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
, в который помещаются флажок и переключатели.
Qt::ButtonGroup
предназначен для логической группировки кнопок, флажков и переключателей. На их визуальное расположение он никак не влияет, зато обеспечивает, к примеру, взаимное исключение (гарантирует, что только один из группы виджетов может быть отмечен). В данном случае этот объект будет источником сигнала
buttonClicked
, который испускается при нажатии любой кнопки в группе.

Этот сигнал отличается от виденных ранее тем, что ему сопутствует аргумент, а именно объект, по которому щелкнули мышкой. Обратите внимание на то, как синтаксис —

QAbstractButton*
 — напоминает о C++-ных корнях Qt. В некоторых случаях употребления принятой в C++ нотации для обозначения типов параметров не избежать (хотя в будущих версиях это, возможно, и исправят).

В результате такого вызова метода

connect
при щелчке по любому виджету, принадлежащему группе, этот виджет будет передан слоту
somethingClicked
. Наконец, мы создаем метку
Qt::Label
, контейнер
Qt::QBoxLayout
и увязываем все вместе.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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