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

Тема в разделе "Софт и инструменты", создана пользователем CLAY, 21 апр 2017.

  1. CLAY

    CLAY Member

    Сообщения:
    419
    Симпатии:
    5
    В прошлой записи был поднят вопрос о создании программы, кросс-платформенность которой будет состоять не только в существовании на нескольких платформах, но и в простой компиляции на этих платформах. Желательно при минимальных изменениях кода. А лучше вообще без изменений.

    В качестве подопытной программы я оставил те же куранты, что и в прошлый раз. А в качестве фреймверка для разработки - 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:lay, которой в скобках передается имя файла, который будет воспроизведен. Имя файла в данном случае задано без пути, поэтому файл должен располагаться в том же каталоге, что и сама программа.

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

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

Поделиться этой страницей