Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Сигналы и слоты




Введение

Сигналы и слоты в Qt

Сигналы и слоты используются для коммуникации между объектами. Механизм сигналов и слотов главная особенность Qt и вероятно та часть, которая отличаетcя от особенностей, предоставляемых другими фреймворками.


В программировании графического интерфейса, когда мы меняем один виджет, мы часто хотим что бы другой виджет получил об этом уведомление. В общем случае, мы хотим что бы объекты любого типа могла общаться с другими. Например, если пользователь нажимает кнопку Закрыть, мы вероятно хотим что бы была вызвана функция окна close().
Другие библиотеки добиваются такого рода общения используя обратный вызов. Обратный вызов это указатель на функцию, таким образом, если мы хотим что бы функция уведомила нас о каких-нибудь событиях, мы передаем указатель на другую функцию (обратновызываемую) этой функции. Функция в таком случае делает обратный вызов когда необходимо. Обратный вызов имеет два основных недостатка. Во-первых, он не является типобезопасным. Мы никогда не можем быть уверены что функция делает обратный вызов с корректными аргументами. Во-вторых, обратный вызов жестко связан с вызывающей его функцией, так как эта функция должна точно знать какой обратный вызов надо делать.


В Qt используется другая техника — сигналы и слоты. Сигнал вырабатывается когда происходит определенное событие. Слот это функция, которая вызывается в ответ на определенный сигнал. Виджеты Qt имеют много предопределенных сигналов и слотов, но мы всегда можем сделать дочерний класс и добавить наши сигналы и слоты в нем.

 

Механизм сигналов и слотов типобезопасен. Сигнатура сигнала должна совпадать с сигнатурой слота-получателя. (Фактически слот может иметь более короткую сигнатуру чем сигнал который он получает, так как он может игнорировать дополнительные аргументы). Так как сигнатуры сравнимы, компилятор может помочь нам обнаружить несовпадение типов. Сигналы и слоты слабо связаны. Класс, который вырабатывает сигнал не знает и не заботится о том, какие слоты его получат. Механизм сигналов и слотов Qt гарантирует, что если мы подключим сигнал к слоту, слот будет вызван с параметрами сигнала в нужное время. Сигналы и слоты могут принимать любое число аргументов любого типа. Они полностью типобезопасны.
Все классы, наследуемые от QObject или его дочерних классов (например, QWidget) могут содержать сигналы и слоты. Сигналы вырабатываются объектами когда они изменяют свое состояние так, что это может заинтересовать другие объекты. При этом он на знает и не заботится о том что у его сигнала может не быть получателя.
Слоты могут быть использованы для получения сигналов, но они так же нормальные функции-члены. Так же как объект не знает ничего о получателях своих сигналов, слот ничего не знает о сигналах, которые к нему подключены. Это гарантирует что полностью независимые компоненты могут быть созданы с помощью Qt.
Мы можем подключать к одному слоту столько сигналов, сколько захотим, также один сигнал может быть подключен к стольким слотам, сколько необходимо. Так же возможно подключать сигнал к другому сигналу (это вызовет выработку второго сигнала немедленно после появления первого).
Сигналы и слоты вместе составляют мощный механизм создания компонентов.

Пример 4.Простой сигнало-слотный.

Рассмотрим простой пример, являющийся некоторой переработкой стандартного «Hello, World!» направленный на ознакомление с сигналами-слотами и так же некоторыми возможностями Qt.

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

Данное приложение состоит из нескольких виджетов: QWidget, QLabel, QPushButton, QSpinBox, QSlider.

QWidget является главным окном приложения. Все виджеты помещены внутрь QWidget, и является дочерними по отношению к нему.

1. int main(int argc, char *argv[])

2. {

3. QApplication app(argc, argv);

4. QWidget *window = new QWidget;

5. window->setWindowTitle("Example");

6. QLabel *label = new QLabel("<h2><i>Hello<i>" "<font color=red> Student!</h2></font>");

 

В строке 6 мы описываем новый label, который будет содержать нужную нам информацию. Как можно заметить, можно пользоваться простыми средствами форматирования документов HTML

 

7. QPushButton *button = new QPushButton("Quit");

8. QObject::connect(button, SIGNAL(clicked()),

9. &app, SLOT(quit()));

10.QSpinBox *spinBox = new QSpinBox;

11.QSlider *slider = new QSlider(Qt::Horizontal);

12.spinBox->setRange(0, 100);

13.slider->setRange(0, 100);

 

Мы объявляем два виджета, наборный счетчик и ползунок. Именно их мы и соединим в последствии сигналом и слотом.

 

14.QObject::connect(spinBox, SIGNAL(valueChanged(int)),

15.slider, SLOT(setValue(int)));

Вызов функции QObject::connect() обеспечивает синхронизацию их работы. Если один из виджетов изменит значение, то сгенерируется сигнал valueChanged(int) и вызовется слот setValue(int) другого виджета.

 

16.QObject::connect(slider, SIGNAL(valueChanged(int)),

17.spinBox, SLOT(setValue(int)));

18.spinBox->setValue(50);

 

Qt имеет в своём распоряжении Менеждер компоновки – это объект, который устанавливает размер и положение виджетов в зоне его действия.

Их три – QHBoxLayout, QVBoxLayout, QGridLayout. Они позволяют не заморачиваться над положением и размером виджетов и знать,что они всё равно будут аккуратно расположены в ряд.

 

19.QHBoxLayout *layout1 = new QHBoxLayout;

20.layout1->addWidget(label);

21.layout1->addWidget(button);

22.QHBoxLayout *layout2 = new QHBoxLayout;

23.layout2->addWidget(spinBox);

24.layout2->addWidget(slider);

25.QVBoxLayout *vlayout = new QVBoxLayout;

26.vlayout->addLayout(layout1);

27.vlayout->addLayout(layout2);

28.window->setLayout(vlayout);

29.window->show();

30.return app.exec();

31. }




Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 1177; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.