- Регистрация
- 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:lay, которой в скобках передается имя файла, который будет воспроизведен. Имя файла в данном случае задано без пути, поэтому файл должен располагаться в том же каталоге, что и сама программа.
Вот мы и подошли к концу - закрываем фигурные скобки, вписываем дежурный return 0 и с замиранием сердца компилируем.
Точнее дважды компилируем - один раз в Windows, а второй в Linux. Никаких сюрпризов - один и тот же код нормально скомпилировался в обоих операционных системах. Задача выполнена. Единственное, о чем следует помнить - при переносе программы нужно брать с собой и библиотеки, функции из которых вы использовали.
В качестве подопытной программы я оставил те же куранты, что и в прошлый раз. А в качестве фреймверка для разработки - 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. Никаких сюрпризов - один и тот же код нормально скомпилировался в обоих операционных системах. Задача выполнена. Единственное, о чем следует помнить - при переносе программы нужно брать с собой и библиотеки, функции из которых вы использовали.