Материал: Разработка и реализация программных средств для работы с веб-контентом в рамках проекта INTERIN PROMIS

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

.        Показывать место в коде где функция была описана или вызвана.

Так же можете использовать 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 &paramsSection="").

)        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 &paramSectionName="").

На рисунке 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].

Источник: https://www.bibliofond.ru/view.aspx?id=897371