Содержание
- 2. Qt («кьют») – это библиотека классов с инструментарием для создания межплатформенных приложений с графическим пользовательским интерфейсом
- 3. * Qt – это библиотека классов с инструментарием для создания межплатформенных приложений с графическим пользовательским интерфейсом
- 4. Краткая история Qt : 1991 - начата разработка Qt Гаавардом Нордом и Айриком Шамбе-Ингом, основавшими компанию
- 5. Разработка Qt как графического toolkit (библиотеки графических компонентов) была начата в 1991 году Гаавардом Нордом и
- 6. Проблема лицензирования X11-версии была решена при помощи перехода на свободную лицензию QPL и основания KDE Free
- 7. Инструменты разработки на Qt (Qt SDK) Qt Creator – кроссплатформенная IDE для работы с Qt. QtDesigner
- 8. В пакете Qt SDK поставляется набор инструментов, которые облегчают разработку приложений с использованием фреймворка. Перечислим основные:
- 9. Структура Qt-проекта
- 10. Структура проекта Qt очень проста, помимо файлов исходного кода на C++ обычно имеется файл проекта с
- 11. Первая программа с использованием Qt // main.cpp #include int main(int argc, char *argv[]) { QApplication app(argc,
- 12. Первая программа на Qt
- 13. Первая программа на Qt
- 14. Первая программа на Qt
- 15. В первой строке листинга подключается заголовочный файл QtGui, включающий в себя заголовочные файлы для используемых в
- 16. Первая программа с использованием Qt // main.cpp #include int main(int argc, char *argv[]) { QApplication app(argc,
- 17. Основные классы Qt
- 18. * Библиотека Qt — это множество классов (более 500). Qt разбита на модули. Любая Qt-программа так
- 19. Обзор иерархии классов Qt
- 20. * Иерархия классов Qt имеет четкую внутреннюю структуру, которую важно понять, чтобы уметь хорошо и интуитивно
- 21. Основные классы модуля QtCore контейнерные классы QList, QVector, QMap ; классы для ввода и вывода QIODevice,
- 22. * Модуль QtCore является базовым для приложений и не содержит классов, относящихся к интерфейсу пользователя. Для
- 23. Основные классы модуля QtGui класс QWidget — базовый класс для всех элементов управления библиотеки Qt; классы
- 24. Модуль QtGui содержит в себе классы, необходимые для программирования графического интерфейса пользователя. В этот модуль входят
- 25. Объектная модель Qt Класс QObject содержит в себе поддержку: сигналов и слотов (signal/slot); таймера; механизма объединения
- 26. Объектная модель Qt подразумевает, что все построено на объектах. Фактически, класс QObject — основной, базовый класс.
- 27. Cвойства Определение свойства в общем виде : Q_PROPERTY ( type name READ getFunction [ WRITE setFunction
- 28. Свойства — это поля, для которых обязательно должны существовать методы чтения. С их помощью можно получать
- 29. Пример. Определение свойства для управления режимом только чтения : class MyClass : public QObject { Q_OBJECT
- 30. Класс MyClass, показанный в листинге, наследуется от QObject. В классе определяется атрибут m_bReadOnly, в котором будут
- 31. Механизм сигналов и слотов
- 32. Преимущества применения механизма сигналов и слотов: каждый класс, унаследованный от QObject, может иметь любое количество сигналов
- 33. Сигналы Пример. Определение и реализация сигнала class MySignal : public QObject { Q_OBJECT public: void sendsignal()
- 34. Сигналы определяются в классе, как и обычные методы, только без реализации. Всю дальнейшую заботу о реализации
- 35. Слоты Пример. Реализация слота class MySlot : public QObject { Q_OBJECT public: MySlot() ; public slots:
- 36. Слоты (slots) — это методы, которые присоединяются к сигналам. По сути, они являются обычными методами. Самое
- 37. Соединение объектов Метод connect () : QObject::connect(const QObject* sender, const char* signal, const QObject* receiver, const
- 38. Параметры метода connect: sender — указатель на объект, высылающий сигнал; signal — это сигнал, с которым
- 39. Соединение объектов Передача сигнала: MyClass::MyClass() : QObject() { connect(pSender, SIGNAL(signalMethod()), SIGNAL(mySignal())); }
- 40. Иногда возникают ситуации, когда объект не обрабатывает сигнал, а просто передает его дальше. Для этого необязательно
- 41. Механизм сигналов и слотов Пример: Приложение , в первом окне которого находится кнопка нажатия, а во
- 42. //main.cpp #include #include "Counter.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel lb1("0"); QPushButton
- 43. В основной программе приложения создается объект надписи lb1, кнопка cmd и объект счетчика counter (описание которого
- 44. // Counter.h #ifndef COUNTER_H #define COUNTER_H #include class Counter : public QObject { Q_OBJECT private: int
- 45. // Counter.cpp #include "Counter.h" Counter::Counter() : QObject(), m_nValue(0) {} void Counter::slotInc() { emit counterChanged(++m_nValue); if (m_nValue
- 46. В листинге метод слота slotInc() высылает два сигнала: counterChanged() и goodbye (). Сигнал goodbye () высылается
- 47. Организация объектных иерархий Конструктор класса QObject : QObject (QObject* pobj = 0); Пример создания объектной иерархии:
- 48. Организация объектов в иерархии снимает с разработчика необходимость самому заботиться об освобождении памяти от созданных объектов.
- 50. Скачать презентацию
Слайд 2Qt («кьют») – это библиотека классов с инструментарием для создания межплатформенных приложений
Qt лежит в основе:
среды рабочего стола KDE Unix-подобных ОС;
таких приложений, как Skype, VLC, Virtual Box и многих других.
Поддерживаются ОС:
MS Windows, Mac OS X;
различные дистрибутивы Linux;
мобильные ОС Symbian S60 и Maemo.
существует две не полностью совместимые ветви версий Qt – 3.х и 4.х.
Слайд 3*
Qt – это библиотека классов с инструментарием для создания межплатформенных приложений с
*
Qt – это библиотека классов с инструментарием для создания межплатформенных приложений с
Однако, в различное время были созданы интерфейсы, позволяющие вести разработку с использованием Qt и на других языках программирования, таких как: Python – PyQt, PySide; Ruby – QtRuby; Java – QtJambi; PHP – PHP-Qt и другие.
Qt лежит в основе популярной среди пользователей Unix-подобных систем среды рабочего стола KDE, а также таких приложений, как Skype, VLC, Virtual Box и многих других.
Использование API Qt вместо других, специфичных для платформы, программных интерфейсов, позволяет создавать приложения, которые, во многих случаях, без всяческих доработок будет компилироваться и исполняться на любой из ОС поддерживаемых Qt, а в большинстве других случаев требовать лишь незначительной доработки. Среди таких ОС, помимо MeeGo – Windows, Mac OS X, различные дистрибутивы Linux, Solaris, использующие оконную систему X11, Symbian, Windows CE.
Слайд 4Краткая история Qt :
1991 - начата разработка Qt Гаавардом Нордом и
Краткая история Qt :
1991 - начата разработка Qt Гаавардом Нордом и
1995 – первый релиз Qt. Qt включает в себя набор графических компонент для Х11/Unix и Windows.
2001 – вышла Qt 3.0, в которой появилась поддержка Mac OS X.
2005 - вышла Qt 4.0.
2008 - компания Trolltech была приобретена компанией Nokia и переименована сперва в Qt Software, а впоследствии — в Qt Development Frameworks.
2009 - вышла Qt 4.5. В фреймворк была добавлена третья опция лицензирования — LGPL, что сделало возможным использование «бесплатной» версии Qt в проектах с закрытым кодом (при выполнении некоторых условий).
Слайд 5Разработка Qt как графического toolkit (библиотеки графических компонентов) была начата в 1991
Разработка Qt как графического toolkit (библиотеки графических компонентов) была начата в 1991
Идея разработки кроссплатфоменного toolkit появилась во время работы над графическим приложением для медицинской индустрии, которое должно было работать в ОС Windows и Unix. Буква Q появилась в названии фреймворка, поскольку Гааварду очень нравилось ее начертание в шрифте, использовавшемся в редакторе Emacs. Буква t, за которой скрывается слово «toolkit», была добавлена по аналогии с Xt – X Toolkit, библиотекой для создания виджетов в оконной системе X.
Несколько лет проект разрабатывался без представления на рынке. Первый релиз Qt был сделан в 1995 году. Он включил в себя набор графических компонент для Х11/Unix и Windows. В версии 3.0, вышедшей в 2001 году, появилась также поддержка Mac OS X.
В различное время фреймворк Qt распространялся под разными лицензиями. Если версия Qt для оконной системы X11 изначально выпускалась как под коммерческой, так и под бесплатной (хотя и не свободной) лицензией с открытым исходным кодом, то первые версии для Windows и Mac OS X существовали лишь в версии для коммерческого использования BSD.
Особую остроту вопрос лицензирования технологии приобрел с ростом популярности оконной среды KDE среди пользователей Linux в конце 90-ых годов, когда стало очевидно, что одна из важнейших компонент наиболее популярной свободной ОС не является свободным ПО.
Слайд 6Проблема лицензирования X11-версии была решена при помощи перехода на свободную лицензию QPL
Проблема лицензирования X11-версии была решена при помощи перехода на свободную лицензию QPL
Хотя к 2003 году версии Qt для OS X и для X11 выпускались под свободными лицензиями, версия для Windows по-прежнему выпускалась лишь под коммерческой лицензией. Это привело к тому, что в 2002 группа независимых разработчиков начала работу по портированию X11-версии фреймворка, выпущенной под лицензией GPL, на Windows. Работа эта, впрочем, не была завершена, поскольку в 2005 была выпущена версия фреймворка 4.0, в действие лицензии GPL было распространено на версии для всех поддерживаемых платформ. Добавленное позднее специальное исключение в лицензию, сделало возможным использование GPL-версии Qt в проектах, использующих одну из целого ряда свободных лицензий, таких, как BSD License, Eclipse Public License и других.
В 2008 году компания Trolltech была приобретена компанией Nokia и переименована сперва в Qt Software, а впоследствии — в Qt Development Frameworks. Вскоре после этого была выпущена версия фреймворка для основной мобильной ОС, использующейся Nokia — Symbian S60. С развитием другой мобильной ОС, разрабатываемой Nokia — Maemo, в Qt была добавлена поддержка и этой платформы.
В версии Qt 4.5, вышедшей 14 января 2009 г., в фреймворк была добавлена третья опция лицензирования — LGPL, что сделало возможным использование «бесплатной» версии Qt в проектах с закрытым кодом (при выполнении некоторых условий).
Слайд 7Инструменты разработки на Qt (Qt SDK)
Qt Creator – кроссплатформенная IDE для работы
Инструменты разработки на Qt (Qt SDK)
Qt Creator – кроссплатформенная IDE для работы
QtDesigner – инструмент для визуального дизайна графических интерфейсов.
QtAssistant – система справки.
qmake – система сборки .
moc – метаобъектный компилятор , предварительная система обработки исходного кода.
uic – компилятор графических интерфейсов, который получает на вход xml файл, сгенерированный QtDesigner, и по нему выдает код на С++.
rcc – компилятор ресурсов.
Слайд 8В пакете Qt SDK поставляется набор инструментов, которые облегчают разработку приложений с
В пакете Qt SDK поставляется набор инструментов, которые облегчают разработку приложений с
Qt Creator – кроссплатформенная IDE для работы с фреймворком Qt, разработанная Qt Software.
QtDesigner – инструмент для визуального дизайна графических интерфейсов. В результате работы QtDesigner создается xml файл, описывающий графический интерфейс.
QtAssistant – система справки.
qmake – система сборки.
moc – метаобъектный компилятор , предварительная система обработки исходного кода. Позволяет использовать механизм слотов и сигналов. Утилита moc ищет в заголовочных файлах на C++ описания классов, содержащие макрос Q_OBJECT, и создаѐт дополнительный исходный файл на C++, содержащий реализацию дополнительных методов.
uic – компилятор графических интерфейсов, который получает на вход xml файл, сгенерированный QtDesigner, и по нему выдает код на С++.
rcc – компилятор ресурсов.
Слайд 9Структура Qt-проекта
Структура Qt-проекта
Слайд 10Структура проекта Qt очень проста, помимо файлов исходного кода на C++ обычно
Структура проекта Qt очень проста, помимо файлов исходного кода на C++ обычно
В make-файле содержится вызов МОС для создания дополнительного кода C++ и необходимых заголовочных файлов. Если проект содержит qrc-файл, то будет также создан файл C++, содержащий данные ресурсов. После этого все исходные файлы компилируются C++ компилятором в файлы объектного кода, которые объединяются компоновщиком link в готовый исполняемый модуль.
Слайд 11Первая программа с использованием Qt
// main.cpp
#include
int main(int
Первая программа с использованием Qt
// main.cpp
#include
int main(int
{ QApplication app(argc, argv);
QLabel lb1("Hello, World !");
lb1.show();
return app.exec();
}
Слайд 12Первая программа на Qt
Первая программа на Qt
Слайд 13Первая программа на Qt
Первая программа на Qt
Слайд 14Первая программа на Qt
Первая программа на Qt
Слайд 15В первой строке листинга подключается заголовочный файл QtGui, включающий в себя заголовочные
В первой строке листинга подключается заголовочный файл QtGui, включающий в себя заголовочные
Сначала создается объект класса QApplication, который осуществляет контроль и управление приложением. Для его создания в конструктор этого класса необходимо передать два аргумента. Первый аргумент представляет собой информацию о количестве аргументов в командной строке, с которой происходит обращение к программе, а второй — это указатель на массив символьных строк, содержащих аргументы, по одному в строке. Любая использующая Qt программа с графическим интерфейсом должна создавать только один объект этого класса, и он должен быть создан до использования операций, связанных с пользовательским интерфейсом.
Затем создается объект класса QLabel. После создания элементы управления Qt по умолчанию невидимы, и для их отображения необходимо вызвать метод show().
Объект класса QLabel является основным управляющим элементом приложения, что позволяет завершить работу приложения при закрытии окна элемента. Если в созданном приложении имеется сразу несколько независимых друг от друга элементов управления, то при закрытии окна последнего такого элемента управления завершится и само приложение.
В последней строке программы приложение запускается вызовом метода QApplication::exec(). С его запуском приводится в действие цикл обработки событий, определенный в классе QCoreApplication, являющимся базовым для QApplication. Этот цикл передает получаемые от системы события на обработку соответствующим объектам. Он продолжается до тех пор, пока либо не будет вызван статический метод QCoreApplication::exit(), либо не закроется окно последнего элемента управления. По завершению работы приложения метод QApplication::exec() возвращает значение целого типа, содержащее код, информирующий о его завершении.
Слайд 16Первая программа с использованием Qt
// main.cpp
#include
int main(int argc,
Первая программа с использованием Qt
// main.cpp
#include
int main(int argc,
{ QApplication app(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
QLabel lb1("Привет, Мир !");
lb1.show();
return app.exec();
}
Слайд 17Основные классы Qt
Основные классы Qt
Слайд 18*
Библиотека Qt — это множество классов (более 500).
Qt разбита на модули.
*
Библиотека Qt — это множество классов (более 500).
Qt разбита на модули.
Модуль Qt Mobility обеспечивает удобную разработку приложений для мобильных платформ, поддерживающих Qt и, в первую очередь, ОС MeeGo.
Qt Mobility предоставляет интерфейс для функциональностей, специфичных для мобильных устройств, таких как, например:
сервисы (GSM-связь, Bluetooth) ;
записная книжка;
мгновенные сообщения;
органайзер;
устройства позиционирования;
сенсоры (акселерометр, датчик освещѐнности).
Слайд 19Обзор иерархии классов Qt
Обзор иерархии классов Qt
Слайд 20*
Иерархия классов Qt имеет четкую внутреннюю структуру, которую важно понять, чтобы уметь
*
Иерархия классов Qt имеет четкую внутреннюю структуру, которую важно понять, чтобы уметь
Наиболее значимый из перечисленных в табл. модулей — это QtCore, так как он является базовым для всех остальных модулей (рис.). Далее идут модули, которые непосредственно зависят от QtCore, это — QtNetwork, QtGui, QtSql и QtXml. И, наконец, модули, зависящие от только что упомянутых модулей — Qt3Support, QtOpenGL и QtSvg.
Для каждого модуля Qt предоставляет отдельный заголовочный файл, содержащий заголовочные файлы всех классов этого модуля. Название этого заголовочного файла соответствует названию самого модуля. Например, для включения QtGui модуля нужно добавить в программу строку #include
Слайд 21Основные классы модуля QtCore
контейнерные классы QList, QVector, QMap ;
классы
Основные классы модуля QtCore
контейнерные классы QList, QVector, QMap ;
классы
классы процесса QProcess и для программирования
многопоточности QThread, QWaitCondition, QMutex ;
классы для работы с таймером QBasicTimer и QTimer ;
классы для работы с датой и временем QDate и QTime ;
класс QObject, являющийся краеугольным камнем объектной
модели Qt ;
базовый класс событий QEvent ;
класс для сохранения настроек приложения QSettings ;
класс приложения QCoreAppiication, из объекта которого, если
требуется, можно запустить цикл событий.
Слайд 22*
Модуль QtCore является базовым для приложений и не содержит классов, относящихся к
*
Модуль QtCore является базовым для приложений и не содержит классов, относящихся к
Остановимся на классе QCoreAppiication. Объект класса приложения QCoreAppiication можно образно сравнить с сосудом, содержащим объекты, подсоединенные к контексту операционной системы.
Срок жизни объекта класса QCoreAppiication соответствует продолжительности работы всего приложения, и он остается доступным в любой момент работы программы.
Объект класса QCoreAppiication должен создаваться в приложении только один раз. К задачам этого объекта можно отнести:
управление событиями между приложением и операционной системой;
передача и предоставление аргументов командной строки.
Слайд 23Основные классы модуля QtGui
класс QWidget — базовый класс для всех элементов
Основные классы модуля QtGui
класс QWidget — базовый класс для всех элементов
управления библиотеки Qt;
классы для автоматического размещения элементов
QVBoxLayout, QHBoxLayout;
классы элементов отображения QLabel, QLCDNumber;
классы кнопок QPushButton, QCheckBox, QRadioButton;
классы элементов установок QSlider, QScroiiBar;
классы элементов ввода QLineEdit, QSpinBox;
классы элементов выбора QComboBox, qtooIBox;
классы меню QMainWindow И QMenu;
классы окон сообщений и диалоговых окон QMessageBox,
QDialog;
классы для рисования QPainter, QBrush, QPen, Qcolor;
классы для растровых изображений Qimage, Qpixmap;
классы стилей QMotif style, Qwindowsstyie и другие;
класс приложения QAppiication, который предоставляет цикл
событий.
Слайд 24Модуль QtGui содержит в себе классы, необходимые для программирования графического интерфейса пользователя.
Модуль QtGui содержит в себе классы, необходимые для программирования графического интерфейса пользователя.
Класс QWidget по своему внешнему виду это не что иное, как заполненный четырехугольник, но за этой внешней простотой скрывается большой потенциал непростых функциональных возможностей. Этот класс насчитывает 254 метода и 53 свойства.
Рассмотрим подробнее класс QApplication. Все, что было сказано ранее о классе QCoreApplication, относится также и к этому классу, так как он является прямым его наследником. В назначение QApplication входит:
установка стиля приложения. Таким образом можно устанавливать стиль Motif, Windows, а также многие другие виды и поведения (Look & Feel) приложения, включая и свои собственные ;
получение указателя на объект рабочего стола (desktop);
получение доступа к буферу обмена;
управление глобальными манипуляциями с мышью (например, установка интервала двойного щелчка кнопкой мыши) и регистрация движения мыши в пределах и за пределами окна приложения;
выдача предупреждающего звукового сигнала ;
обеспечение правильного завершения работающего приложения при завершении работы операционной системы ;
инициализация необходимых настроек приложения, например, палитры для расцветки элементов управления .
Слайд 25Объектная модель Qt
Класс QObject содержит в себе поддержку:
сигналов и слотов (signal/slot);
Объектная модель Qt
Класс QObject содержит в себе поддержку:
сигналов и слотов (signal/slot);
таймера;
механизма объединения объектов в иерархии;
событий и механизма их фильтрации;
организации объектных иерархий;
метаобъектной информации;
приведения типов;
свойств.
Слайд 26Объектная модель Qt подразумевает, что все построено на объектах. Фактически, класс QObject
Объектная модель Qt подразумевает, что все построено на объектах. Фактически, класс QObject
Сигналы и слоты — это средства, позволяющие эффективно производить обмен информацией о событиях, вырабатываемых объектами.
Поддержка таймера дает возможность каждому из классов, унаследованных от класса QObject, не создавать дополнительно объект таймера. Тем самым экономится время на разработку.
Механизм объединения объектов в иерархические структуры позволяет резко сократить временные затраты при разработке приложений, не заботясь об освобождении памяти создаваемых объектов, так как объекты-предки сами отвечают за уничтожение своих потомков.
Механизм фильтрации событий позволяет осуществить их перехват. Фильтр событий может быть установлен в любом классе, унаследованном от QObject, благодаря чему можно изменять реакцию объектов на происходящие события без изменения исходного кода класса.
Метаобъектная информация включает в себя информацию о наследовании классов, что позволяет определять, являются ли классы непосредственными наследниками, а также узнать имя класса.
Для приведения типов Qt предоставляет шаблонную функцию qobject_cast
Слайд 27Cвойства
Определение свойства в общем виде :
Q_PROPERTY ( type name
READ getFunction
Cвойства
Определение свойства в общем виде :
Q_PROPERTY ( type name
READ getFunction
[ WRITE setFunction ]
[ RESET resetFunction ]
[ DESIGNABLE bool ]
[ SCRIPTABLE bool ]
[STORED bool]
)
Слайд 28Свойства — это поля, для которых обязательно должны существовать методы чтения. С
Свойства — это поля, для которых обязательно должны существовать методы чтения. С
В определении свойства первыми задаются тип и имя свойства, вторым — имя метода чтения (read). Определение остальных параметров не является обязательным. Третий параметр задает имя метода записи (write), четвертый — имя метода сброса значения (reset), пятый (designable) является логическим (булевым) значением, говорящим о том, должно ли свойство появляться в инспекторе свойств Qt Designer. Шестой параметр (scriptable)— также логическое значение, которое управляет тем, будет ли свойство доступно для языка сценариев Qt Script. Последний, седьмой параметр (stored) управляет сериализацией, то есть тем, будет ли свойство запоминаться во время сохранения объекта.
Слайд 29Пример. Определение свойства для управления режимом только чтения :
class MyClass :
Пример. Определение свойства для управления режимом только чтения :
class MyClass :
{ Q_OBJECT
Q_PROPERTY(bool readonly READ isReadOnly WRITE setReadOnly)
private: bool m_bReadOnly;
public: MyClass(QObject* pobj 0) : QObject(pobj)
, m_bReadOnly(false) { }
public: void setReadOnly(bool bReadOnly)
{ m__bReadOnly = bReadOnly;}
bool isReadOnly() const
{ return m__bReadOnly; }
}
pobj ->setProperty ("readonly", true);
bool bReadOnly = pobj->property ("readonly").toBool();
Слайд 30Класс MyClass, показанный в листинге, наследуется от QObject. В классе определяется атрибут
Класс MyClass, показанный в листинге, наследуется от QObject. В классе определяется атрибут
Для получения и изменения значения атрибута в классе MyClass определены методы isReadOnly() И setReadOnly (). Эти Методы регистрируются в макросе Q_PROPERTY.
Метод isReadOnly() служит для получения значения, поэтому указывается в секции READ, а метод setReadOnly () — для изменения значения, поэтому пишется в секции WRITE.
Из программы мы можем изменить значение нашего свойства следующим
образом:
pobj ->setProperty ("readonly", true) ;
А так можно получить текущее значение:
bool bReadOnly = pobj->property ("readonly"). toBool () ;
Слайд 31Механизм сигналов и слотов
Механизм сигналов и слотов
Слайд 32Преимущества применения механизма сигналов и слотов:
каждый класс, унаследованный от QObject, может
Преимущества применения механизма сигналов и слотов:
каждый класс, унаследованный от QObject, может
сообщения, посылаемые посредством сигналов, могут иметь множество аргументов любого типа;
сигнал можно соединять с различным количеством слотов. Высылаемый сигнал поступит ко всем подсоединенным слотам;
слот может принимать сообщения от многих сигналов, принадлежащих разным объектам;
соединение сигналов и слотов можно производить в любой точке приложения;
сигналы и слоты являются механизмами, обеспечивающими связь между
объектами.
при уничтожении объекта происходит автоматическое разъединение всех сигнально - слотовых связей. Это гарантирует, что сигналы не будут высылаться к несуществующим объектам.
Недостатки, связанные с применением сигналов и слотов:
сигналы и слоты не являются частью языка C++, поэтому требуется запуск дополнительного препроцессора перед компиляцией программы;
отсылка сигналов происходит немного медленнее, чем обычный вызов функции, который производится при использовании механизма функций обратного вызова;
существует необходимость в наследовании класса QObject;
в процессе компиляции не производится никаких проверок: имеется ли сигнал или слот в соответствующих классах или нет; совместимы ли сигнал и слот друг с другом и могут ли они быть соединены вместе. Об ошибке можно будет узнать лишь тогда, когда приложение будет запущено.
Слайд 33Сигналы
Пример. Определение и реализация сигнала
class MySignal : public QObject
{ Q_OBJECT
Сигналы
Пример. Определение и реализация сигнала
class MySignal : public QObject
{ Q_OBJECT
signals: void doIt();
};
class MySignal : public QObject
{ Q_OBJECT
public: void sendSignal()
{ emit sendString("Information"); }
signals:
void sendString(const QStringb);
};
Слайд 34Сигналы определяются в классе, как и обычные методы, только без реализации. Всю
Сигналы определяются в классе, как и обычные методы, только без реализации. Всю
Сигнал не обязательно соединять со слотом. Если соединения не произошло, то он просто не будет обрабатываться. Подобное разделение высылающих и получающих объектов исключает возможность того, что один из подсоединенных слотов каким-то образом сможет помешать объекту, выславшему сигналы.
Библиотека предоставляет большое количество уже готовых сигналов для существующих элементов управления. В основном, для решения поставленных задач хватает этих сигналов, но иногда возникает необходимость реализации новых сигналов в своих классах.
Не имеет смысла определять сигналы как private, protected или public, так как они играют роль вызывающих методов.
Выслать сигнал можно при помощи ключевого слова emit. Ввиду того, что сигналы играют роль вызывающих методов, конструкция высылки сигнала emit doit () приведет к обычному вызову метода doit (). Сигналы могут высылаться из классов, которые их содержат.
Чтобы иметь возможность отослать сигнал программно из объекта этого класса, следует добавить метод sendsignal (), вызов которого заставит объект класса MySignal высылать сигнал doit ().
Сигналы также имеют возможность высылать информацию, передаваемую в параметре. Например, если возникла необходимость передать в сигнале строку текста,
Слайд 35Слоты
Пример. Реализация слота
class MySlot : public QObject
{ Q_OBJECT
Слоты
Пример. Реализация слота
class MySlot : public QObject
{ Q_OBJECT
public slots:
void slot() { qDebug() << "I'm a slot"; }
};
Слайд 36Слоты (slots) — это методы, которые присоединяются к сигналам. По сути, они
Слоты (slots) — это методы, которые присоединяются к сигналам. По сути, они
Примечание .По данным фирмы Nokia, соединение сигнала с виртуальным слотом примерно в десять раз медленнее, чем с невиртуальным. Поэтому не стоит делать слоты виртуальными, если нет особой необходимости.
Есть небольшие ограничения, отличающие обычные методы от слотов. В слотах нельзя использовать параметры по умолчанию, например slotMethod( int n = 8) , или определять слоты как static.
Классы библиотеки содержат целый ряд уже реализованных слотов. Но определение слотов для своих классов — это частая процедура.
Слайд 37Соединение объектов
Метод connect () :
QObject::connect(const QObject* sender,
const char*
Соединение объектов
Метод connect () :
QObject::connect(const QObject* sender,
const char*
const QObject* receiver,
const char* slot,
Qt::ConnectionType type = Qt::Autoconnection
);
Пример соединения объектов в программе.
QObject:: connect (pSender, SIGNAL (signalMethod()) , pReceiver, SLOT(slotMethod())
);
Слайд 38Параметры метода connect:
sender — указатель на объект, высылающий сигнал;
signal —
Параметры метода connect:
sender — указатель на объект, высылающий сигнал;
signal —
receiver — указатель на объект, который имеет слот для обработки сигнала;
slot — слот, который вызывается при получении сигнала. Прототип слота должен быть заключен в специальном макросе SLOT (method ());
type — управляет режимом обработки. Имеется три возможных значения: Qt: :Directconnection — сигнал обрабатывается сразу вызовом соответствующего метода слота, Qt: :Queuedconnection— сигнал преобразуется в событие и ставится в общую очередь для обработки, Qt: Autoconnection — это следующим образом: если высылающий сигнал объект находится в одном потоке с принимающим его объектом, то устанавливается режим Qt: :QueuedConnection, В противном случае— режим Qt: :DirectConnection. Этот режим(Qt: :Autoconnection) определен в методе connection ( ) по умолчанию.
В случае, если слот содержится в классе, из которого производится соединение, то можно воспользоваться сокращенной формой метода connect(), опустив третий параметр (pReceiver), указывающий на объект-получатель. Другими словами, если в качестве объекта-получателя должен стоять указатель this, его можно просто не указывать.
Слайд 39Соединение объектов
Передача сигнала:
MyClass::MyClass() : QObject()
{
connect(pSender, SIGNAL(signalMethod()), SIGNAL(mySignal()));
}
Соединение объектов
Передача сигнала:
MyClass::MyClass() : QObject()
{
connect(pSender, SIGNAL(signalMethod()), SIGNAL(mySignal()));
}
Слайд 40Иногда возникают ситуации, когда объект не обрабатывает сигнал, а просто передает его
Иногда возникают ситуации, когда объект не обрабатывает сигнал, а просто передает его
Высылку сигналов заблокировать можно на некоторое время, вызвав метод blocksignais() с параметром true. Объект будет "молчать", пока блокировка не будет снята тем же методом blocksignals () с параметром false.
При помощи метода signalsblocked() можно узнать текущее состояние блокировки сигналов.
Слайд 41Механизм сигналов и слотов
Пример: Приложение , в первом окне которого находится
Механизм сигналов и слотов
Пример: Приложение , в первом окне которого находится
Слайд 42//main.cpp
#include
#include "Counter.h"
int main(int argc, char
//main.cpp
#include
#include "Counter.h"
int main(int argc, char
{ QApplication app(argc, argv);
QLabel lb1("0");
QPushButton cmd("ADD");
Counter counter;
lb1.show(); cmd.show();
QObject::connect(&cmd, SIGNAL(clicked()), &counter, SLOT(slotInc()));
QObject::connect(&counter, SIGNAL(counterChanged(int)),&lb1, SLOT(setNum(int)));
QObject::connect(&counter, SIGNAL(goodbye()),&app, SLOT(quit()));
return app.exec();
}
Слайд 43В основной программе приложения создается объект надписи lb1, кнопка cmd и объект
В основной программе приложения создается объект надписи lb1, кнопка cmd и объект
в файлах Counter.h и Counter.cpp). Далее сигнал clicked() соединяется со слотом slotInc(). При каждом нажатии на кнопку вызывается метод slotInc(), увеличивая значение счетчика на 1. Он должен быть в состоянии сообщать о подобных изменениях, чтобы элемент надписи отображал всегда только актуальное значение. Для этого сигнал counterChanged(int), передающий в параметре актуальное значение счетчика, соединяется со слотом setNum (int), способным принимать это значение.
Примечание. При соединении сигналов со слотами, передающими значения, важно следить за совпадением их типов. Например, сигнал, передающий в параметре значение int, не должен соединяться со слотом, принимающим QString.
Сигнал goodbye(), символизирующий конец работы счетчика, соединяется со слотом объекта приложения quit(), который осуществляет завершение работы приложения, после нажатия кнопки ADD в пятый раз.
Приложение состоит из двух окон, и после закрытия последнего окна его работа автоматически завершится.
Слайд 44// Counter.h
#ifndef COUNTER_H
#define COUNTER_H
#include
// Counter.h
#ifndef COUNTER_H
#define COUNTER_H
#include
{ Q_OBJECT
private: int m_nValue;
public: Counter();
public slots: void slotInc();
signals: void goodbye();
void counterChanged(int);
};
#endif // COUNTER_H
Слайд 45// Counter.cpp
#include "Counter.h"
Counter::Counter() : QObject(), m_nValue(0)
{}
// Counter.cpp
#include "Counter.h"
Counter::Counter() : QObject(), m_nValue(0)
{}
{ emit counterChanged(++m_nValue);
if (m_nValue == 5)
{ emit goodbye();}
}
Слайд 46В листинге метод слота slotInc() высылает два сигнала:
counterChanged() и goodbye ().
В листинге метод слота slotInc() высылает два сигнала:
counterChanged() и goodbye ().
Если есть возможность соединения объектов, то должна существовать и возможность их разъединения. В Qt, при уничтожении объекта, все связанные с ним соединения уничтожаются автоматически, но в редких случаях может возникнуть необходимость в уничтожении этих соединений "вручную".
Для этого существует статический метод disconnect(), параметры которого аналогичны параметрам статического метода connect().
Слайд 47Организация объектных иерархий
Конструктор класса QObject :
QObject (QObject* pobj = 0);
Пример
Организация объектных иерархий
Конструктор класса QObject :
QObject (QObject* pobj = 0);
Пример
QObject* pobj1 = new QObject;
QObject* pobj2 = new QObject(pobj1);
QObject* pobj4 = new QObject(pobj2);
QObject* pobj3 = new QObject(pobj1);
pobj2->setObjectName("the first child of pobj1");
pobj3->setObjectName("the second child of pobj1");
pobj4->setObjectName("the first child of pobj2");
Слайд 48Организация объектов в иерархии снимает с разработчика необходимость самому заботиться об освобождении
Организация объектов в иерархии снимает с разработчика необходимость самому заботиться об освобождении
В конструктор класса QObject передается указатель на другой объект класса QObject или унаследованного от него класса. Благодаря этому параметру существует возможность создания объектов-иерархий. Он представляет собой указатель на объект-предок. Если в первом параметре передается значение равное нулю или ничего не передается, то это значит, что у создаваемого объекта нет предка, и он будет являться объектом верхнего уровня и находиться на вершине объектной иерархии. Объект-предок задается в конструкторе при создании объекта, но впоследствии его можно в любой момент исполнения программы изменить на другой при помощи метода setParent ( ).
Созданные объекты по умолчанию не имеют имени. При помощи метода setObjectName() можно присвоить объекту имя. Имя объекта не имеет особого значения, но может быть полезно при отладке программы. Для того чтобы узнать имя объекта, можно вызвать метод objectName( ).
В первой строке листинга создается объект верхнего уровня (объект без предка). При создании объекта pobj2 в его конструктор передается, в качестве предка, указатель на объект pobj1. Объект pobj3 имеет в качестве предка pobj1, а объект pobj4 имеет предка pobj2.