Обработка сообщений. Сигналы и слоты. Сигнально-слотовая модель Для обработки событий в Qt используется сигнально-слотовое расширение языка C++. Идея этого механизма заключается в следующем механизме обработки событий: от элемента управления поступают сигналы, соответствующие определённым событиям, и для их обработки эти сигналы перенаправляются в специальные слоты, которые, по сути, являются функциями-обработчиками. SIGNAL (произошло /--->[SLOT обработки 1] [Элемент управления]----------------->|+---->[SLOT обработки 2] событие) \--->[SLOT обработки 3] Преимущества использования сигналов и слотов: 1) каждый объект, унаследованный от Object, может иметь множество сигналов и слотов; 2) каждый сигнал может иметь множество аргументов любого типа; 3) сигнал можно соединить со множеством слотом, и поступает он в таком случае ко всем подсоединённым слотам; 4) слот может принимать сообщения от многих сигналов, принадлежащих разным объектам; 5) соединение сигналов и слотов можно производить в любой точке приложения; 6) при удалении объекта автоматически удаляются все сигнально-слотовые связи. Недостатки: 1) не являются частью С++, поэтому требуют запуск дополнительного процесса перед запуском программы; 2) отсылка сигнала намного медленнее функций обратного вызова; 3) существует необходимость в наследовании класса Object. Сигналы и слоты -- абстрактный механизм, реализующий событийную модель Qt. Сигнал -- действие, гарантированное по прохождению какого-нибудь события. При использовании сигнала слоты, с ним связанные, исполняются немедленно, так же, как при вызове обычной функции. Когда это случается, механизм сигналов и слотов полностью независим от цикла обработки графического интерфейса пользователя. Выполнение кода, следующее за выражением emit, продолжится, как только завершится выполнение всех слотов. В случае с очередями соединений ситуаций несколько отличается, при этом исполнение последующего кода начинается немедленно, а слоты выполняются несколько позже. Если несколько слотов связаны с одним сигналом, то при испускании сигнала они будут выполняться один за другим. Слот -- это функция-обработчик, вызываемая, когда генерируется сигнал, к которому она подключена. Слот -- это функция, вызываемая в ответ на определённый сигнал. Слот вызывается, как только испускается подключённый к нему сигнал. Это обычные функции C++, их единственная особенность -- то, что к ним могут присоединяться сигналы. Виджеты Qt имеют множество предопределённых слотов, но можно создавать подклассы виджетов и добавлять свои слоты. "signal" signals: void сигнал(параметры); emit сигнал(параметры); Существует возможность подключения одного сигнала к другому, при инициации первого он автоматически будет инициировать второй сигнал. QObject..connect(источник,SIGNAL(сигнал1),приёмник,SIGNAL(сигнал2)); Слоты объявляются в секции slot "slots" доступ slots: void слот(параметры); Для подключения сигнала к слоту используется статический метод connect. bool QObject..connect( const QObject* sender, const char* signal, const QObject* receiver, const char* method, Qt..ConnectionType type =Qt.AutoConnection ); Использование сигналов и слотов для синхронизации двух виджетов Программа предлагает пользователю ввести свой возраст. Сделать это можно либо с помощью кнопки управления счётчиком, либо с помощью ползунка. Приложение содержит три виджета: QSpinBox, QSlider, QHBox. Компоненты помещены внутрь QHBox и являются подчинёнными по отношению к нему. В Qt главный виджет осуществляет автоматическое размещение подчинённых виджетов, задавая положения и размеры исходя из их собственных настроек. #include #include #include #include int main(int argc,char* argv[]) { QApplication app(argc,argv); QHBox* hbox=new QHBox(0); hbox->setCaption("Enter Your Age"); hbox->setMargin(6); hbox->setSpacing(6); QSpinBox* spinBox=new QSpinBox(hBox); QSlider* slider=new QSlider(Qt.. +----- | | -----+ QObject::connect(spinBox,SIGNAL(valueChanged(int)),slider,8toT(setValue(int)); QObject::connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(intValue(int)); Элементы управления Наиболее распространёнными элементами управления являются кнопка, текстовое поле и текстовая метка. Кнопка реализуется классом QPushButton, который является наследником QAbstractButton. Для использования кнопок нужно подключить или . Кнопка имеет конструктор видов QPushButton(QWidget* parent=0) (принимает указатель на виджет родителя), QPushButton(const QString& text, QWidget* parent=0) (также строку, которая должна отображаться на кнопке). Методы: void setText(const Qstring& text) +-------- | | --------+ Кнопка-флажок и радиокнопка представлены классами QCheckBox и QRadioButton. Разница между флажком и радиокнопкой в том, что только одна радиокнопка из всей группы может быть выбрана. Название класса: кнопка-флажок (QCheckBox). Конструктор класса: QCheckBox(QWidget* parent=0) QCheckBox(const QString& text, QWidget* parent=0). Описание параметров: text -- строка, отображаемая рядом с флажком, parent -- указатель на родительский виджет. Радиокнопка. Название класса: QradioButton. Конструктор класса: QRadioButton(QWidget* parent=0) +---------- | | ------------+ Для изменения состояния радиокнопки или флажка можно использовать сигнал CLICK, который вызывается только при щелчке пользователем на виджете. При изменении состояния лучше использовать сигнал void toggled(bool checked) isChecked() -- генерируется при изменении состояния флажка радиокнопки. Текстовое поле Для работы с текстовыми полями в Qt используются классы QLineEdit(QWidget* parent=0) и QLineEdit(const QString& contents,QWidget* parent=0). Параметры: parent -- родитель, contents -- начальное содержание строки. QTextEdit -- многострочное текстовое поле. QString toPlainText() const -- получить неформатированный текст QString toHtml() const -- получить текст с HTML-форматированием void setPlainText(const QString& text) -- установка текста void setHtml(const QString& text) -- установка текста с HTML Текстовая метка QLabel. Конструкторы: QLabel(QWidget* parent=0, Qt::WindowFlags f=0) QLabel(const QString &text, QWidget* parent=0, Qt::Windowflags f=0)