Редактирование: Qt:Документация 4.3.2/signalsandslots

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 2: Строка 2:
=Сигналы и слоты<br />=
=Сигналы и слоты<br />=
-
 
Сигналы и слоты используются для связи между объектами. Механизм сигналов и слотов - это основная особенность Qt и, вероятно, основная часть Qt, которая больше всего отличается от особенностей других структур.
Сигналы и слоты используются для связи между объектами. Механизм сигналов и слотов - это основная особенность Qt и, вероятно, основная часть Qt, которая больше всего отличается от особенностей других структур.
-
*[[#introduction | Введение]]
 
-
*[[#signals-and-slots | Сигналы и слоты]]
 
-
*[[#a-small-example | Небольшой пример]]
 
-
*[[#building-the-example | Сборка примера]]
 
-
*[[#signals | Сигналы]]
 
-
*[[#slots | Слоты]]
 
-
*[[#meta-object-information | Метаобъектная информация]]
 
-
*[[#a-real-example | Реальный пример]]
 
-
<div id="introduction"></div>
 
==Введение==
==Введение==
-
 
При GUI-программировании, мы часто хотим сообщать одним элементам об изменении других элементов управления. Более обобщенно можно сказать, что мы хотим обеспечить связь между объектами любых видов. Например, если пользователь нажимает кнопку '''Close''', мы, вероятно, хотим, чтобы была вызвана функция окна [[Qt:Документация 4.3.2/qwidget#close | close()]].
При GUI-программировании, мы часто хотим сообщать одним элементам об изменении других элементов управления. Более обобщенно можно сказать, что мы хотим обеспечить связь между объектами любых видов. Например, если пользователь нажимает кнопку '''Close''', мы, вероятно, хотим, чтобы была вызвана функция окна [[Qt:Документация 4.3.2/qwidget#close | close()]].
Более старые инструментарии обеспечивают подобную связь с помощью отзывов. Обратный вызов, это указатель на функцию. Если Вы хотите чтобы функция обработки уведомила Вас о некотором событии, Вы передаете ей указатель на другую функцию (отзыв). Функция обработки вызовет функцию отзыва, когда это будет уместно. Отзыва имеют два фундаментальных недостатка: Во-первых, они не типобезопасны. Мы некогда не можем проверить, что функция обработки вызывает отзыв с правильными аргументами. Во-вторых, отзыв жестко связан с функцией обработки, так как функция обработки должна знать, какой отзыв вызывать.
Более старые инструментарии обеспечивают подобную связь с помощью отзывов. Обратный вызов, это указатель на функцию. Если Вы хотите чтобы функция обработки уведомила Вас о некотором событии, Вы передаете ей указатель на другую функцию (отзыв). Функция обработки вызовет функцию отзыва, когда это будет уместно. Отзыва имеют два фундаментальных недостатка: Во-первых, они не типобезопасны. Мы некогда не можем проверить, что функция обработки вызывает отзыв с правильными аргументами. Во-вторых, отзыв жестко связан с функцией обработки, так как функция обработки должна знать, какой отзыв вызывать.
-
<div id="signals-and-slots"></div>
+
 
==Сигналы и слоты==
==Сигналы и слоты==
-
 
В Qt мы ввели технику, альтернативную отзывам: Мы используем сигналы и слоты. Сигнал испускается, когда происходит определенное событие. Виджеты Qt имеют множество предопределенных сигналов, и Вы всегда можете создать их подклассы, чтобы добавить свои сигналы. Слот - это функция, вызываемая в ответ на определенный сигнал. Виджеты Qt имеют множество предопределенных слотов, но Вы, и это стало общеиспользуемой практикой, можете создавать подклассы виджетов и добавлять свои слоты для того, чтобы обрабатывать поступающие сигналы, как Вы того хотите.
В Qt мы ввели технику, альтернативную отзывам: Мы используем сигналы и слоты. Сигнал испускается, когда происходит определенное событие. Виджеты Qt имеют множество предопределенных сигналов, и Вы всегда можете создать их подклассы, чтобы добавить свои сигналы. Слот - это функция, вызываемая в ответ на определенный сигнал. Виджеты Qt имеют множество предопределенных слотов, но Вы, и это стало общеиспользуемой практикой, можете создавать подклассы виджетов и добавлять свои слоты для того, чтобы обрабатывать поступающие сигналы, как Вы того хотите.
Строка 35: Строка 23:
Вместе, сигналы и слоты представляют собой мощный механизм компонентного программирования.
Вместе, сигналы и слоты представляют собой мощный механизм компонентного программирования.
-
<div id="a-small-example"></div>
 
-
==Небольшой пример==
 
 +
==Небольшой пример==
Минимальная декларация класса C++ может выглядеть следующим образом:
Минимальная декларация класса C++ может выглядеть следующим образом:
<source lang="cpp-qt">    class Counter
<source lang="cpp-qt">    class Counter
Строка 99: Строка 86:
Данный пример иллюстрирует совместную работу объектов, которые ничего не знают друг о друге. Для ее достижения объекты должны быть соединены с помощью вызова простой функции [[Qt:Документация 4.3.2/qobject#connect | QObject::connect]](), или с помощью возможности [[Qt:Документация 4.3.2/designer-using-a-component#automatic-connections | автоматического связывания]] <tt>uic</tt>.
Данный пример иллюстрирует совместную работу объектов, которые ничего не знают друг о друге. Для ее достижения объекты должны быть соединены с помощью вызова простой функции [[Qt:Документация 4.3.2/qobject#connect | QObject::connect]](), или с помощью возможности [[Qt:Документация 4.3.2/designer-using-a-component#automatic-connections | автоматического связывания]] <tt>uic</tt>.
-
<div id="building-the-example"></div>
 
-
==Сборка примера==
 
 +
==Сборка примера==
Препроцессор C++ заменяет или удаляет ключевые слова <tt>signals</tt>, <tt>slots</tt> и <tt>emit</tt> для того, чтобы компилятору был предоставлен стандартный код на C++.
Препроцессор C++ заменяет или удаляет ключевые слова <tt>signals</tt>, <tt>slots</tt> и <tt>emit</tt> для того, чтобы компилятору был предоставлен стандартный код на C++.
[[Qt:Документация 4.3.2/moc#moc | moc]] обрабатывает определения классов, содержащих сигналы и слоты и генерирует файлы реализации C++, которые будут скомпилированы и связаны с другими объектными файлами приложения. Если Вы используете [[Qt:Документация 4.3.2/qmake-manual#qmake | qmake]], то в make-файл будет автоматически добавлен вызов <tt>moc</tt>.
[[Qt:Документация 4.3.2/moc#moc | moc]] обрабатывает определения классов, содержащих сигналы и слоты и генерирует файлы реализации C++, которые будут скомпилированы и связаны с другими объектными файлами приложения. Если Вы используете [[Qt:Документация 4.3.2/qmake-manual#qmake | qmake]], то в make-файл будет автоматически добавлен вызов <tt>moc</tt>.
-
<div id="signals"></div>
 
-
==Сигналы==
 
 +
==Сигналы==
Сигналы испускаются объектом, когда изменяется его внутреннее состояние, и если это может быть интересно его клиентам или владельцу. Только классы, содержащие определения сигналов, и их подклассы могут испускать сигналы.
Сигналы испускаются объектом, когда изменяется его внутреннее состояние, и если это может быть интересно его клиентам или владельцу. Только классы, содержащие определения сигналов, и их подклассы могут испускать сигналы.
Строка 117: Строка 102:
Примечание о сигналах: Наш опыт показывает, что сигналы и слоты более широко используются, если они не используют специальных типов. Если сигнал [[Qt:Документация 4.3.2/qabstractslider#valueChanged | QScrollBar::valueChanged]]() должен использовать специальный тип, такой как гипотетический QScrollBar::Range, он может быть соединен только со слотами, которые работают [[Qt:Документация 4.3.2/qscrollbar | QScrollBar]]. Что-либо столь-же простое, как программа [[Qt:Документация 4.3.2/tutorial-t5 | Tutorial 5]], в этом случае было-бы невозможно.
Примечание о сигналах: Наш опыт показывает, что сигналы и слоты более широко используются, если они не используют специальных типов. Если сигнал [[Qt:Документация 4.3.2/qabstractslider#valueChanged | QScrollBar::valueChanged]]() должен использовать специальный тип, такой как гипотетический QScrollBar::Range, он может быть соединен только со слотами, которые работают [[Qt:Документация 4.3.2/qscrollbar | QScrollBar]]. Что-либо столь-же простое, как программа [[Qt:Документация 4.3.2/tutorial-t5 | Tutorial 5]], в этом случае было-бы невозможно.
-
<div id="slots"></div>
 
-
==Слоты==
 
 +
==Слоты==
Слот вызывается как только испускается соединенный с ним сигнал. Слоты - это обычные функции C++, и могут вызываться обычным образом; их единственная особенность - это то, что к ним могут быть присоединены сигналы. Слоты не могут иметь значений аргументов по умолчанию и использование в качестве типов аргументов Ваших собственных типов редко является мудрым решением.
Слот вызывается как только испускается соединенный с ним сигнал. Слоты - это обычные функции C++, и могут вызываться обычным образом; их единственная особенность - это то, что к ним могут быть присоединены сигналы. Слоты не могут иметь значений аргументов по умолчанию и использование в качестве типов аргументов Ваших собственных типов редко является мудрым решением.
Строка 135: Строка 119:
Обратите внимание на то, что другие библиотеки, определяющие переменные с именем <tt>signals</tt> или <tt>slots</tt>, могут вызвать предупреждения и ошибки при компиляции с приложением, созданным на основе Qt. Решить эту проблему может директива препроцессора <tt>#undef</tt>.
Обратите внимание на то, что другие библиотеки, определяющие переменные с именем <tt>signals</tt> или <tt>slots</tt>, могут вызвать предупреждения и ошибки при компиляции с приложением, созданным на основе Qt. Решить эту проблему может директива препроцессора <tt>#undef</tt>.
-
<div id="meta-object-information"></div>
 
-
==Метаобъектная информация==
 
 +
==Метаобъектная информация==
Метаобъектный компилятор ([[Qt:Документация 4.3.2/moc#moc | moc]]) просматривает декларацию класса в файле C++ и генерирует код C++ инициализирующий метаобъект. Метаобъект содержит имена всех сигналов и слотов и указатели на их функции.
Метаобъектный компилятор ([[Qt:Документация 4.3.2/moc#moc | moc]]) просматривает декларацию класса в файле C++ и генерирует код C++ инициализирующий метаобъект. Метаобъект содержит имена всех сигналов и слотов и указатели на их функции.
Строка 149: Строка 132:
             button->toggle();</source>  
             button->toggle();</source>  
Для получения более подробной информации см. [[Qt:Документация 4.3.2/metaobjects | Метаобъектная Система]].
Для получения более подробной информации см. [[Qt:Документация 4.3.2/metaobjects | Метаобъектная Система]].
-
<div id="a-real-example"></div>
 
-
==Реальный пример==
 
 +
==Реальный пример==
Далее приведен простой пример виджета с комментариями.
Далее приведен простой пример виджета с комментариями.
<source lang="cpp-qt">    #ifndef LCDNUMBER_H
<source lang="cpp-qt">    #ifndef LCDNUMBER_H

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Wiki.crossplatform.ru:Авторское право). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!


Шаблоны, использованные на текущей версии страницы: