- Урок №1. Введение в Qt и установка Qt Creator
- Введение в Qt
- Установка Qt Creator в Linux
- Установка Qt Creator через командную строку в Linux
- Установка Qt Creator в Windows
- Создание проекта
- Qt — трудности перевода
- Исходная программа
- Шаг 1. Указание всех строк, для которых требуется сделать перевод
- Шаг 2. Создание перевода
- Шаг 3. Загрузка файлов переводов в приложении.
- Дополнительные текстовые строки
- Динамический перевод
Урок №1. Введение в Qt и установка Qt Creator
Обновл. 16 Сен 2021 |
На этом уроке мы познакомимся с кроссплатформенным фреймворком Qt и установим IDE для работы с ним.
Введение в Qt
Qt является кроссплатформенным (не зависящим от платформы/ОС) фреймворком для разработки приложений на языке С++. С помощью Qt были разработаны такие известные приложения, как: KDE, Opera, Google Earth и Skype. Впервые Qt был опубликован в мае 1995 года.
Qt5 подразумевает двойное лицензирование, а это означает, что Qt может быть использован в некоммерческих целях для создания приложений с открытым исходным кодом, а также как лицензия для коммерческих клиентов. За счет использования собственного фреймворка и мощного инструментария Qt позволяет быстро и удобно создавать собственные кроссплатформенные приложения. Кроме того, команды разработчиков получают возможность работать на разных платформах, используя при этом общие инструменты для разработки и отладки. Весь инструментарий Qt с открытым исходным кодом вы можете найти на сайте qt.io.
Изначально Qt был разработан норвежской компанией по разработке программного обеспечения Trolltech. В 2008 году компанию приобрела Nokia. Спустя четыре года в августе 2012 программные технологии Qt выкупила финская компания-разработчик Digia. Сейчас Qt развивается компанией QT Company, которая является дочерней компанией Digia, и как проект Qt под открытым исходным кодом с участием отдельных разработчиков и фирм.
Установка Qt Creator в Linux
Шаг №1: Мы будем устанавливать IDE с открытым исходным кодом. Для этого переходим по ссылке и выбираем самую свежую версию (на момент написания данной статьи — это Qt 5.13):
На этих уроках используется операционная система Linux (Debian 9.x 64-bit), поэтому мы скачиваем qt-opensourse-linux-x64-5.13.0.run , но вы также можете использовать соответствующие файлы Qt для Windows или macOS:
После окончания загрузки переходим в папку с необходимым нам файлом, нажимаем на него правой кнопкой мыши и выбираем «Свойства» . На вкладке «Основные» видим «Имя» , «Тип» , «Размер файла» , а также наименование родительской папки:
Переходим на вкладку «Права» и ставим галочку возле пункта «Разрешить выполнение файла как программы» :
Закрываем «Свойства» и запускаем программу.
Шаг №2: На следующем этапе установщик сообщает, что нам предоставлена версия с открытым исходным кодом Qt 5.13.0. Дальнейшая установка Qt предполагает регистрацию в Qt и создание Qt Account, который предоставляет доступ ко всем возможностям Qt. Кроме того, данное действие необходимо для проверки лицензии (коммерческая/некоммерческая). Если у вас уже есть учетная запись в Qt Account, то используйте кнопку «Next» .
Если учетной записи в Qt Account у вас еще нет, то её можно создать сейчас: для этого перейдите по соответствующей ссылке в установщике, и вы будете перенаправлены на сайт qt.io в соответствующий раздел, или просто используйте кнопку «Next» — вы сможете это сделать на следующем шаге:
Шаг №3: Здесь необходимо ввести логин и пароль от Qt Account или создать Qt Account, если его у вас еще нет. Кнопка «Next» переводит нас на следующий этап:
Добро пожаловать в настройки Qt 5.13.0! Для перехода к следующему шагу нажимаем «Далее >» :
Шаг №4: Выбираем каталог для установки Qt 5.13.0. Обратите внимание, адрес каталога указывается латинскими буквами (без кириллицы) и без пробелов! После того, как выбрали каталог, нажимаем «Далее >» :
Шаг №5: Выбираем компоненты, которые хотим установить. Если на данном этапе у вас нет уверенности в выборе конкретных компонентов, то добавление и удаление можно будет сделать позже, после установки программы:
Шаг №6: Принимаем лицензионное соглашение:
И нажимаем на кнопку «Установить» :
Для завершения установки нажимаем «Завершить» . После завершения установки Qt Creator запустится самостоятельно (для этого необходимо поставить галочку возле пункта «Launch Qt Creator» ):
Вот примерно следующее вы должны увидеть при запуске Qt Creator:
Поздравляем! Qt Creator установлен.
Установка Qt Creator через командную строку в Linux
Еще одним альтернативным и простым способом установки Qt Creator в Linux на основе Debian является установка из пакетов. Если при работе с Linux вы используете терминал, то перед скачиванием и установкой Qt Creator программа запросит пароль пользователя root (команда sudo без дополнительных опций). Только после этого начнется скачивание и извлечение файлов. Обычно, пакеты Linux не содержат последней версии Qt и их необходимо обновить. Ниже приведен алгоритм действий, позволяющий за 4 шага установить Qt Creator через терминал в Linux.
Шаг №1: Обновление набора утилит для установки, удаления, обновления, поиска пакетов в Linux.
$ sudo apt update
Шаг №2: Скачивание и установка Qt.
$ sudo apt install qt5-default
Шаг №3: Установка Qt Creator.
$ sudo apt install qtcreator
Шаг №4: Установка тестовых программ.
$ sudo apt install qtbase5-examples qtdeclarative5-examples
Установка Qt Creator в Windows
Сначала нам нужно скачать установочный пакет Qt. Вы можете это сделать, обратившись к оф. сайту qt.io. Либо же воспользоваться альтернативным вариантом и скачать с какого-нибудь «зеркала» (например, c этого, полный список всех «зеркал» находится здесь):
Нажимаем на official_releases/ и переходим к online_installers/ :
Нажимаем на online_installers/ и скачиваем файл qt-unified-windows-x86-online.exe :
Запустив скачанный файл, видим перед собой приветствие «Qt Online Installer». Нажимаем «Next» :
Далее у нас спросят о наличии Qt Account. Можно смело нажимать «Skip» и двигаться дальше:
Затем снова «Далее» :
Теперь нам нужно указать путь установки Qt. Для простоты я выбрал C:\Qt :
На следующем шаге нам нужно выбрать набор компиляторов, которыми мы будем пользоваться на данных уроках. Я предлагаю ограничиться выбором пакета MinGW 7.3.0 32-bit , а остальные метки поставить так, как указано на скриншоте ниже:
После того, как инсталлятор скачает и установит все необходимые компоненты, можно будет перейти к непосредственному написанию кода для нашего приложения.
Создание проекта
Вначале нам необходимо создать проект. Сразу скажу, что наша программа будет консольным приложением. Для этого выберите «Файл» > «Создать файл или проект…» или можно воспользоваться сочетанием клавиш Ctrl+N :
Перед вами появится «Мастер настройки проектов». В левой колонке отметьте пункт «Приложение» , а затем в правой — «Консольное приложение Qt» :
На следующем шаге нужно будет указать имя для нашей будущей программы и папку, где будут располагаться файлы проекта. У меня это My_QtApplication и C:\dev\Qt_Project соответственно:
На следующем шаге без изменений, поэтому просто нажимаем кнопку «Далее» :
Теперь нам нужно выбрать набор компиляторов, который мы будем использовать для сборки нашего проекта. Я настоятельно рекомендую выбрать Desktop Qt 5.13.0 MinGW 32-bit (сняв при этом отметки с остальных, если они у вас есть):
На последнем шаге нажимаем «Завершить» :
Теперь вы можете увидеть автоматически сгенерированный Qt-проект консольного приложения. Давайте рассмотрим его детально:
Источник
Qt — трудности перевода
Исходная программа
Пусть у нас есть простая программа:
- #include
- #include
- int main( int argc, char *argv[]) <
- QApplication app(argc, argv);
- QLabel label( «Hello, World!» );
- label.show();
- return app.exec();
- >
* This source code was highlighted with Source Code Highlighter .
Все что она делает — создает окно с надписью «Hello,World!». Сделаем для нее перевод на русский язык.
Шаг 1. Указание всех строк, для которых требуется сделать перевод
Все строки, которые увидит пользователь должны быть обработаны функциями QObject::tr() или QcoreApplication::translate().
У всех классов Qt, наследуемых от QObject, есть функция-член tr(). Так как мы работаем со строкой в глобальной функции которая не относится ни к какому классу, то используем функцию translate(), которая позволяет указать контекст перевода, то есть класс, к которому он относится (в данном случае — QLabel).
- #include
- #include
- int main( int argc, char *argv[]) <
- QApplication app(argc, argv);
- QLabel label(app.translate( «QLabel» , «Hello, World!» ));
- label.show();
- return app.exec();
- >
* This source code was highlighted with Source Code Highlighter .
В фунцкиях tr() и translate() после переводимой строки можно указать комментарий, который будет показан переводчику во время перевода приложения на другой языка. Комментарии используются для устранения двусмысленности.
Если вам потребуется перевести текст, который находится вне функции, есть два макроса для помощи: QT_TR_NOOP() и QT_TRANSLATE_NOOP(), аналогичные tr() и translate(). Они незаметно помечают текст для извлечения утилитой lupdate, про которую мы поговорим ниже:
- static const char *greeting_strings[] = <
- QT_TR_NOOP( «Hello» ),
- QT_TR_NOOP( «Goodbye» )
- >;
- static const char *greeting_strings[] = <
- QT_TRANSLATE_NOOP( «HelloWidget» , «Hello» ),
- QT_TRANSLATE_NOOP( «HelloWidget» , «Goodbye» )
- >;
* This source code was highlighted with Source Code Highlighter .
При отключении автоматического преобразования из const char * в QString путем компиляции программы с определенным макросом QT_NO_CAST_FROM_ASCII можно найти все строки, которые пропустили.
Когда в середину строки нам понадобится вставлять значения каких-либо переменных, лучше всего использовать функцию arg(). Например, при копировании файлов мы могли бы отображать ход процесса следующим образом:
Если потребуется изменить порядок аргументов при переводе, то при переводе надо будет поменять переменные с символом % местами, например, вот так:
«Копируем файл %3. %1 из %2 файлов скопировано»
Переписывать программу из-за этого не потребуется.
Шаг 2. Создание перевода
После того как мы использовали tr() по всему приложению, надо создать перевод текста. Перевод текста так же содержит 3 шага:
- Запуск lupdate для извлечения переводимого текста из исходного кода приложения Qt на C++, создавая файл сообщений для переводчиков (файл .ts). Утилита распознает конструкторы tr() и translate() и макросы QT_TR*_NOOP(), описанные выше, и производит файлы .ts (обычно один на каждый язык).
- Обеспечение переводов для исходных текстов в файле .ts, используя Qt Linguist. Так как файлы .ts в формате XML, их можно также отредактировать вручную.
- Запуск lrelease для получения легкого файла сообщений (файл .qm) из файла .ts, удобного только для конечного пользования. Думайте о файлах .ts как об «исходных файлах», и о файлах .qm как об «объектных файлах». Переводчик редактирует файлы .ts, но пользователям нашего приложения требуются только файлы .qm. Оба типа файлов не зависят от платформы и локали.
Обычно надо повторять эти шаги для каждого выпуска приложения. Утилита lupdate делает все возможное по повторному использованию переводов от предыдущих релизов.
Перед запуском lupdate, вам потребуется подготовить файл проектов. Вот как будет выглядеть наш файл проекта (файл helloworld.pro):
TEMPLATE = app
TARGET = release
DEPENDPATH +=.
INCLUDEPATH +=.
SOURCES += main.cpp
TRANSLATIONS += helloworld_ru.ts
Когда вы запускаете lupdate или lrelease, вы должны предоставить имя файла проекта в качестве аргумента командной строки.
Шаг 3. Загрузка файлов переводов в приложении.
В нашем приложении мы должны загрузить QTranslator::load() файлы используя QcoreApplication::installTranslator(). Окончательная версия программы примет вид:
- #include
- #include
- int main( int argc, char *argv[]) <
- QApplication app(argc, argv);
- QTranslator myTranslator;
- myTranslator.load( «helloworld_» + QLocale::system().name());
- app.installTranslator(&myTranslator);
- QLabel label(app.translate( «QLabel» , «Hello, World!» ));
- label.show();
- return app.exec();
- >
* This source code was highlighted with Source Code Highlighter .
Мы создаем объект QTranslator, загружаем в него файл перевода с помощью функции load(). В ней мы указываем начало имени файла нашего перевода. По умолчанию файлы переводов ищутся в папке с программой, но можно указать любую директорию, передав ее имя в качестве второго параметра функции. Расширение «.qm» будет добавлено автоматически. Функция Qlocale::system().name() возвращает имя текущей локали, в моем случае это было ru_RU.UTF-8. Порядок поиска файла переводов функцией load() будет следующим:
- helloworld_ru_RU.UTF-8.qm
- helloworld_ru_RU.UTF-8
- helloworld_ru_RU.qm
- helloworld_ru_RU
- helloworld_ru.qm
- helloworld_ru
- helloworld.qm
- helloworld
Правда когда я попробовал загрузить таким образом файл переводов в Windows XP, у меня ничего не вышло. Оказалось, что (по крайней мере у меня так) функция Qlocale::system().name() все время возвращала значение «С». Поэтому стоит предусмотреть дополнительный способ указания языка интерфейса приложения, например, через диалог настроек программы или параметры командной строки.
Вот и все, наше приложение переведено на русский язык, но есть еще парочка моментов, о которых стоит упомянуть в данной статье.
Дополнительные текстовые строки
Qt содержит внутри около 400 строк, которые так же должны быть переведены на языки которые нам необходимы. В директории $QTDIR/translations можно найти файлы переводов для французского, немецкого и упрощенного китайского, так же как и шаблоны для перевода на другие языки. (Эта директория так же содержит некоторые дополнительные неподдерживаемые переводы, которые могут быть полезны, например, перевод на русский язык).
Обычно эти переводы подгружают так же в фунции main():
- int main( int argc, char *argv[])
- <
- .
- QTranslator qtTranslator;
- qtTranslator.load( «qt_» + QLocale::system().name(),
- QLibraryInfo::location(QLibraryInfo::TranslationsPath));
- app.installTranslator(&qtTranslator);
- .
- >
* This source code was highlighted with Source Code Highlighter .
Обратите внимание на использование QLibraryInfo::location() для обнаружения переводов Qt. Разработчик должен запросить путь к переводам обрабатывая QLibraryInfo::TranslationsPath для этой функции вместо использования переменной среды QTDIR в своих приложениях. Хотя в случаях, когда мы не уверены что у пользователя стоит полная версия Qt, имеет смысл поставлять этот файл переводов вместе с программой и загружать его из директории программы (или любой другой на выбор).
Динамический перевод
Некоторые приложения должны обеспечивать изменения настроек языка пользователя во время работы. Что бы предупредить виджеты об изменениях установленного QTranslators, можно переделать фунцкцию виджета changeEvent() для проверки не является ли событие событием LanguageChange, и обновите текст, отображаемый виджетами, используя функцию tr() обычным способом. Например:
- void MyWidget::changeEvent(QEvent * event )
- <
- if (e->type() == QEvent::LanguageChange) <
- titleLabel->setText(tr( «Document Title» ));
- .
- okPushButton->setText(tr( «&OK» ));
- > else
- QWidget::changeEvent( event );
- >
* This source code was highlighted with Source Code Highlighter .
Все остальные события изменения должны быть обработаны вызовом реализации по умолчанию данной функции.
Список установленных переводов может быть изменен в реакции на событие LocaleChange, или приложение может предоставлять интерфейс пользователю, который позволит ему изменить текущий язык приложения.
Обработчик событий по умолчанию для подклассов QWidget отвечает на событие QEvent::LanguageChange и вызовет эту функцию при необходимости; в других компонентах приложения можно так же заставить виджеты обновить себя отправив им событие LanguageChange.
UPD: Как подсказывает intellinside, классы графического интерфейса пользователя, сгенерированные Qt Designer’ом, имеют функцию retranslateUi(), которую можно вызвать для динамического изменения языка приложения.
Источник