Кросс-платформенное программирование 2 (Qt)

CLAY
Оффлайн
Регистрация
25.01.17
Сообщения
763
Реакции
225
Репутация
292
В прошлой записи был поднят вопрос о создании программы, кросс-платформенность которой будет состоять не только в существовании на нескольких платформах, но и в простой компиляции на этих платформах. Желательно при минимальных изменениях кода. А лучше вообще без изменений.

В качестве подопытной программы я оставил те же куранты, что и в прошлый раз. А в качестве фреймверка для разработки - Qt. Средой разработки будет Eclipse.

Начинается все с того, что нужно установить фреймверк. Скачать его можно с официального сайта.

Для ознакомления вполне достаточно свободной версии - переходим во вкладку LGPL:

Тутнасинтересуетпункт "Qt libraries 4.6.3 for Windows (minGW 4.4, 280 MB)". Объем довольно внушительный, но выбрать лишь необходимую часть возможности нет - придется качать все.

Удобно, что SDK представляет собой исполняемый файл, который все разложит как надо. По этому, после закачки достаточно запустить установщик, покликать "Дальше-дальше" и все будет готово.

В Linux процедура еще тривиальнее - даже на сайт идти не нужно. Совершаем поиск по запросу "qt4-dev" в своем пакетном менеджере, отмечаем его для установки и кликаем "Применить". Все, что нужно дополнительно пакетный менеджер выкачает сам.

Останется лишь прицепить поддержку разработки на Qt к Eclipse. Об этом тоже уже позаботились: на том же qt.nokia.com в разделе для разработчиков есть все, что нужно:

Выбираем архив для нужной нам платформы и скачиваем его. Пользователи Windows снова получат исполняемый файл, который сам развернет плагин, нужно только указать ему каталог, в который установлен Eclipse.

Пользователям Linux придется разархивировать и поместить плагин в каталог Eclipse самостоятельно.

После того, как вы все сделаете в Эклипс появятся соответствующие пункты меню, для создания проектов на Qt

Выбираем создание проекта для консольного приложения.

Вот мы и добрались непосредственно до кода. На этот раз он будет таким:

Рассмотрим отличия от предыдущих версий.

Первыми, по порядку, идут подключаемые библиотеки:

QDateTime - библиотека с функцией для работы со временем

QSound - как нетрудно догадаться, библиотека для работы со звуком

QThread - библиотека для управления потоками. Из нее нам потребуется функция sleep

Основная функция и объявление переменных для хранения часов, минут и секунд такие же, как в прошлый раз. Для хранения времени потребуется переменная особого типа QTime. Я назвал ее "currenttime" - текущее время.

Дальше мы снова начинаем вечный цикл и первым делом получаем текущее время используя метод класса QTime, который называется currentTime. Полученные данные помещаются в переменную с почти таким же названием, описанную абзацем выше.

Переменная "currenttime" представляет собой структуру, обращаясь к разным полям которой можно получить необходимые данные. Воспользуемся этим и поместим в специальные переменные значения, соответствующие часам, минутам и секундам. Вообще, можно было бы и дальше использовать конструкции "currenttime.hour()" и т.д., но это показалось мне не слишком удобным и несколько громоздким.

Перевод количества часов в двенадцатиричную систему не притерпел изменений.

А вот со sleep пришлось повозиться. Дело в том, что в Qt метод sleep является статическим защищенным методом класса QThread. То есть просто так вызвать sleep(1) в программе нельзя. Но можно создать наследника класса QThread, в котором этот метод сделать доступным. Это мы и делаем дальше. Класс я решил назвать SleepClass, потому что он затевался лишь для того, чтобы получить доступ к одной единственной функции.

После этого обращаемся к sleep уже как к методу нашего нового класса - SleepClass::sleep(1); Единичка в скобках - число секунд, которые поток будет спать.

Условия срабатывания курантов - без изменений. Но изменился способ воспроизведения звука - теперь это Qt-функция QSound::play, которой в скобках передается имя файла, который будет воспроизведен. Имя файла в данном случае задано без пути, поэтому файл должен располагаться в том же каталоге, что и сама программа.

Вот мы и подошли к концу - закрываем фигурные скобки, вписываем дежурный return 0 и с замиранием сердца компилируем.

Точнее дважды компилируем - один раз в Windows, а второй в Linux. Никаких сюрпризов - один и тот же код нормально скомпилировался в обоих операционных системах. Задача выполнена. Единственное, о чем следует помнить - при переносе программы нужно брать с собой и библиотеки, функции из которых вы использовали.
 
Сверху Снизу