. Показывать место в коде где функция была описана или вызвана.
Так же можете использовать Qt Designer чтобы располагать и настраивать ваши виджеты или диалоги и тестировать их используя разные стили и разрешения экрана. Созданные с помощью Qt Designer виджеты и формы легко интегрируются в программный код с использованием механизма сигналов и слотов Qt, которые позволят легко определить поведение графических элементов. Все свойства, установленные в Qt Designer, могут быть динамически изменены в коде. Более того, такие особенности как продвижение виджетов и собственные модули позволят использовать собственные виджеты с Qt Designer.
Языки
Можно использовать редактор для написания кода на Qt C++ или на языке декларативного программирования QML.
Язык QML позволяет создавать очень гибкий интерфейс пользователя из обширного набора элементов QML. Он помогает разработчикам и дизайнерам работать вместе над созданием гибких пользовательских интерфейсов, которые получат распространение на портативных устройствах, таких как сотовые телефоны, медиаплееры, неттопы и нетбуки.это расширение JavaScript, которое предоставляет механизм декларативной сборки дерева объектов из элементов QML. QML улучшает интеграцию между JavaScript и существующей системой Qt, основанной на QObject, добавляет поддержку автоматического связывания свойств и обеспечивает сетевую прозрачность на уровне языка [13].
Цели
Qt Creator предоставляет поддержку для сборки и запуска приложений на Qt для настольных компьютеров (Windows, Linux и Mac OS) и мобильных устройств (Symbian, Maemo и MeeGo). Настройки сборки позволяют быстро переключаться между целями сборки.
Когда разработчиквы собирает приложение для мобильного устройства,
подключённого к компьютеру, Qt Creator генерирует пакет установки,
устанавливает его на устройстве и запускает его.
3.2 Разработка ядра системы
Разработка главной функции ядра системы
Функция main вызывается при старте программы после инициализации нелокальных объектов со статической длительностью хранения. Это точка входа в программу, которая исполняется в гостевом окружении (то есть с операционной системой). Точки входа в автономные программы (boot loaders, OS kernels, и т.п.) зависят от реализации.
Параметры функции main в варианте с двумя параметрами позволяют передать произвольные многобайтовые строки из окружения выполнения (обычно это аргументы командной строки), указатели (argv[1] и. argv[argc-1]) ссылаются на первые символы этих строк. argv[0] - указатель на первый символ многобабайтовой строки с завершающим нулём, которая содержит имя, используемое при вызове программы. Эти строки изменяемые, хотя их изменения не распространяются назад в окружение выполнения: они могут использоваться, например, в std::strtok. Размер массива, на который указывает argv, равен по меньшей мере argc+1, и последний элемент массива argv[argc] гарантированно является null-указателем.
Функция main обладает следующими специальными свойствами:
. Она нигде не может быть использована в программе.
. Её нельзя объявлять и нельзя перегружать: фактически имя main зарезервировано в глобальном пространстве имён.
. Её нельзя объявить как удалённую или определить со связыванием для C (начиная с C++17), inline, static или constexpr.
. В теле функции main не обязателен оператор return: при завершении функции main без оператора return эффект будет тот же самый, как при выполнении return 0.
. Выполнение return (или неявного return при достижении конца функции main) эквивалентно нормальному выходу из функции (которое уничтожает объекты с автоматическим временем жизни) с последующим вызовом std::exit с тем же самым аргументом, который был передан в return. (std::exit уничтожает статические объекты и завершает программу).
. Если функция main определена как function-try-block, исключения, брошенные деструкторами статических объектов (которые уничтожаются при вызове std::exit), не отлавливаются функцией.
. Тип возвращаемого значения функцией main не может быть выведен (auto main() {...} не разрешён) [14].
В разрабатываемой системе точкой входа в программу является функция main, именно она отвечает за логику
работу с библиотеками, параметрам и подсистемой логирования.
Рисунок 3.3 - Блок-схема алгоритма функции main ядра системы
Рисунок 3.4 - Блок-схема алгоритма функции main ядра системы
Рисунок 3.5 - Блок-схема алгоритма функции main ядра системы
На рисунке 3.6 изображен снимок экрана разработанной функции main,
вынесенной в одноименный файл main.cpp.
Рисунок 3.6 - Снимок экрана разработанной функции main
Исходный код функции main представлен в приложении А.
Разработка менеджера модулей
Менеджер модулей реализован в виде двух классов GSModulesManager и GSModule. Далее перечислены открытые интерфейсы класса GSModulesManager:
1. GSModulesManager(const QString &objectName, QObject *parent = Q_NULLPTR).
. Virtual ~GSModulesManager().
. GSModule *loadModule(const QString &moduleName="").
. virtual void loadAllModules(void *abstractInterface=Q_NULLPTR, bool doInit=false).
. Void unloadModule(GSModule* module).
. Void unloadAllModules().
. Void setLog(GSLog *log=Q_NULLPTR).
. Virtual void init().
. Virtual void onEvent(const QString &event, char param).
. Void *getWidget(const QString &widgetID).
. Char checkUpdates(const QString &listFileName, bool forceUpdate=false).
. QString& getNewExeName().
. QString& getInstName().
. Void exeUpdated(const QString fileName).
. Void instReceived(const QString fileName).
Открытые интерфейсы класса GSModule:
. GSModule(const QString &moduleName, const QString &modulesSection,
. QObject *parent = Q_NULLPTR).
. Virtual ~GSModule().
. Char init(void *abstractInterface).
. Char start().
. Char stop().
. QString about(char content).
. Bool isLoaded().
. Bool load().
. Bool unload().
. Char onEvent(const QString &event, char param).
. Void *getWidget(const QString &widgetId).
. Vvoid setLog(GSLog *log=Q_NULLPTR).
На рисунке 3.7 изображен снимок экрана реализованного менеджера модулей,
вынесенного в файл gsModule.cpp.
Рисунок 3.7 - Снимок экрана реализованного менеджера модулей
Исходный код менеджера модулей представлен в приложении Б.
Разработка подсистемы работы с параметрами
Подсистема работы с параметрами реализована в виде класса GSApplication. Далее перечислены его открытые интерфейсы:
1. GSApplication(int &argc, char **argv).
. Virtual ~GSApplication().
. Static GSApplication *theApplication().
. Virtual void saveParams().
. Virtual void readParams().
. GSLog *createAppLog(const QString &objectName="").
. GSLog* getAppLog().
. GSModulesManager *createModulesManager(const QString &objectName="").
. QUuid getAppUID().
. Void isWow64(QString *appDigits).
На рисунке 3.8 изображен снимок экрана реализованной подсистемы работы с
параметрами, вынесенной в файл gsApplication.cpp.
Рисунок 3.8 - Снимок экрана реализованной подсистемы работы с параметрами
Исходный код подсистемы работы с параметрами представлен в приложении В.
Разработка подсистемы логирования
Подсистема логирования реализована в виде класса GSLog. Далее перечислены его открытые интерфейсы:
1) GSLog(QObject *pobj=Q_NULLPTR,const QString &objectName="").
) Virtual ~GSLog().
) Bool init(const QString ¶msSection="").
) Bool setLogFileName(QString &value=QString()).
) QString getLogFileName().
) Void setLogLevel(int value).
) Int getLogLevel().
) Void setlogMessagesLevel(int value=0).
) GSLog& toLog(int level=0, QObject *pobj=Q_NULLPTR).
) GSLog& operator <<(QString &value).
) GSLog& operator <<(const QString &value).
) GSLog& operator <<(char *value).
) GSLog& operator <<(const char *value).
) GSLog& operator <<(bool value).
) GSLog& operator <<(int value).
) GSLog& operator <<(QTextStream &(__cdecl *)(QTextStream &)).
) GSLog& operator <<(QEvent::Type value.
На рисунке 3.9 изображен снимок экрана реализованной подсистемы
логирования, вынесенной в файл gsLog.cpp.
Рисунок 3.9 - Снимок экрана реализованной подсистемы логирования
Исходный код подсистемы логирования представлен в приложении Г.
Разработка модуля обновлений
Модуль обновлений реализован виде класса gsUpdateFiles. Далее перечислены его открытые интерфейсы:
1) Enum TUpdatePolicy {newOnly,fullUpdate}.
) GSUpdateFiles(QWidget *parent = 0).
) Virtual ~GSUpdateFiles().
) Virtual void getUpdatesList(const QString &listFileName).
) Virtual void buildUpdatesTree(const QString &listFileName.
) Const QString &modulesSection.
) TUpdatePolicy updatePolicy=newOnly).
) Void setLog(GSLog *log=Q_NULLPTR).
) Virtual void init(const QString ¶mSectionName="").
На рисунке 3.10 изображен снимок экрана реализованного модуля обновления,
вынесенного в файл gsUpdateFiles.cpp.
Рисунок 3.10 - Снимок экрана реализованного модуля обновления
Исходный код модуля обновления представлен в приложении Д.
3.3 Разработка модуля главного окна системы и модуля печати
В данной системе модуль главного окна является основным модулем, именно ему предается управление после запуска ядра. На данном этапе модули главного окна и модуль печати объединены в одну библиотеку под названием «InterinClntMainWnd.dll».
Стоит обратить внимание на подсистемы загрузки файлов, печати в файл формата pdf, а так же настройки системы.
Разработка подсистемы загрузки файлов
Подсистема загрузки файлов реализована в виде класса DownloadManager. Далее перечислены его открытые интерфейсы:
1) void stop();
) void open();
) void print();
) void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
5) void finished().
На рисунке 3.11 изображен снимок экрана реализованной подсистемы печати,
вынесенной в файл gsUpdateFiles.cpp.
Рисунок 3.11 - Снимок экрана реализованной подсистемы загрузки файлов
Исходный код подсистемы загрузки файлов представлен в приложении Е.
Разработка подсистемы печати
Модуль печати состоит из сторонней библиотеки, над которой сделана надстройка, где прописаны все функции этой библиотеки, а так же вызовы этих функций приведены к стандартному виду qt. Таким образом скрыто низкоуровневое обращение к функциям сторонней библиотеки. Основной функцией модуля печати является получение файла, затем, в зависимости от параметра в адресе страницы, либо сразу отправляется на печать, либо открывается предустановленным в ОС программным обеспечением. Перед отправкой на печать (прозрачной), этот модуль может указать размер бумаги, ее ориентацию, дуплекс и количество копий.
На рисунке 3.12 изображен снимок экрана реализованного диалогового окна
печати в файл формата pdf,
вынесенного в файл printtopdfdialog.cpp.
Рисунок 3.12 - Снимок экрана реализованного диалогового окна печати в
файл формата pdf
Исходный код реализованного диалогового окна печати в файл формата pdf представлен в приложении Ж.
Разработка подсистемы настроек
Настройки всей системы реализованы в реестре операционной системы. Они позволяют не просто настроить систему, но полностью изменить логику ее работы, путем изменения или добавления библиотек.
На рисунке 3.13 изображен снимок экрана реализованной подсистемы настроек
вынесенной в файл settings.cpp.
Рисунок 3.13 - Снимок экрана реализованной подсистемы настроек системы
Создание инсталлятора программной системы
Для создания инсталлятора целесообразно воспользоваться готовыми программными средствами, например, Inno Setup. Для работы системы необходим следующий набор компонент:
. Исполняемый файл ядра системы.
. Модуль главного окна системы.
. Функциональные библиотеки.
Скрипт Inno Setup , который содержит свойства дистрибутива и набор
производимых действий при установке и удалении представлен в приложении З.
4. ТЕСТИРОВАНИЕ СИСТЕМЫ
.1 Инсталяция программы
Инстлятор клиента представляет собой исполняемый файл с раширением .exe. Его название имеет следующий вид:
InterinClient_XX_setup, где XX - версия инсталятора. В процессе установки пользователю
предлагается прочесть лицензионное соглашение, выбрать директурю для установки,
а так же у пользователя есть возможность вобора название приложения в меню
пуск, и необходимость создания ярлыка на рабочем столе. На рисунке 4.1
представлен снимок экрана процесса установки клиента.
Рисунок 4.1 - Снимок экрана процесса установки клиента.
В процессе установки клиента, инсталлятор создает ветвь (\HKEY_CURRENT_USER\Software\Interin) в реестре операционной систем, а в выбранную директорию распаковываются исполняемый файл системы (InterinClient.exe), а так же все необходимые для его работы библиотеки и модули.
4.2 Тестирование функциональной части программы
Функциональное тестирование - процесс проверки соответствия поведения системы первоначально заявленным функциональным требованиям [15].