Запуск Qt-приложений
Собрать Qt-приложение можно как в IDE Qt Creator, так и без неё. Будут продемонстрированы оба способа сборки.
Запуск приложений возможен несколькими способами:
- СКИФ
- 1892ВМ14Я
- С использованием оконной системы Wayland.
- Через Framebuffer.
- С использованием оконной системы (например X11).
- Через OpenGL.
- Через Framebuffer.
- СКИФ
- 1892ВМ14Я
В данном руководстве описан только способ запуcка через Wayland.
В данном руководстве описан только способ запуcка через OpenGL - EGLFS.
Сборка приложения выполняется на хосте. Для этого нужен кросс-компилятор и образ для запуска на модуле.
Сборка кросс-компилятора и образа прошивки SD
Подготовка
- Установить docker (см. мануалы на Вашу ОС).
- Добавить пользователя ОС в группу docker (
usermod -a -G docker $USER
). - Требуется доступ в Интернет (необходимо проверить настройки сети и/или корпоративных прокси).
- Свободного места на диске должно быть более 30ГБ.
- СКИФ
- 1892ВМ14Я
В этом разделе мы будем собирать кросс-компилятор arm-mcom03. Он нужен для сборки приложений на хосте под тагрет-систему.
В этом разделе мы будем собирать кросс-компилятор arm-mcom02. Он нужен для сборки приложений
на хосте под тагрет-систему. Qt уже включен
в defconfig mcom_defconfig
.
Конфигурация Buildroot
- СКИФ
- 1892ВМ14Я
Потребуется архив с Buildroot (последнего релиза):
wget https://dist.elvees.com/mcom03/buildroot/<vers>/mcom03-defconfig-src.tar.gz && \
tar xzpf mcom03-defconfig-src.tar.gz && \
cd mcom03-defconfig-src
Необходимо установить и настроить docker. Корректная сборка возможна только в docker-контейнере. Необходимо ознакомиться с Руководством.
В версии 2024.06 добавлен фрагмент qt.fragment
, включающий конфигурацию, описанную в этом
руководстве.
export ENABLE_NETWORK=1
./docker-build.sh make mcom03_defconfig FRAGMENTS=qt
./docker-build.sh 'make sdk && make'
Если применить указанный фрагмент, то можно переходить к пункту Разработка Qt-приложений или Запуск на модуле. Дальнейшая конфигурация опциональна и для базового использования не требуется.
Ручная конфигурация описана ниже.
Применить файл конфигурации:
./docker-build.sh make mcom03_defconfig
Не рекомендуется запускать сборку от имени root!
Потребуется архив с buildroot nightly:
wget https://dist.elvees.com/mcom02/buildroot/nightly/latest/\
mcom02-buildroot-v3.1.4-111-gedf1e68-2022-03-10.tar.bz2 && \
tar xf mcom02-buildroot*.tar.bz2 && \
cd mcom02-buildroot*/
Данное руководство не описывает процесс подготовки ПК к запуску Buildroot. Необходимо ознакомиться с Руководством_программиста. И продолжить после того, как все подготовительные этапы пройдены.
Применить стандартый файл конфигурации для MCom02:
make mcom_defconfig
Добавить QWidgets
widgets по умолчанию не включены в defconfig:
make menuconfig
Там же можно включить и другие необходимые компоненты
Добавить python-пакет (опционально)
- СКИФ
- 1892ВМ14Я
Дополнительно включить Qt Wayland (menuconfig):
- Target packages → Graphic libraries and applications → Qt5 → qt5wayland
- Target packages → Graphic libraries and applications → Qt5 → Oqt5base → gui module → OpenGL support → opengl module
Добавить шрифты DejaVu
Включить Event-ы в ядре Linux
Event-ы требуются, если в приложении нужно получать события устройств ввода, например, клавиатуру, мышь, тачпад и т.д.
make linux-menuconfig
Сборка
./docker-build.sh 'make sdk && make'
make sdk
выполняет сборку переносимого тулчейна c ARM-компилятором для целевой платы.
Дальнейшая работа будет демонстрироваться с этим тулчейном.
Это полезно, если сборка Buildroot выполняется на одном ПК, а разработка Qt-приложения – на другом.
Если нужно что-нибудь включить в сборку - можно пересобрать только указанный
пакет: make <package>-rebuild
:
./docker-build.sh 'make qt5base-rebuild && \
make python-rebuild && \
make dejavu && \
make sdk && \
make'
- СКИФ
- 1892ВМ14Я
При добавлении нового элемента Qt нужно пересобрать SDK и образ
rootfs.tar.gz (далее - rootfs
). Новый rootfs
нужно загрузить на модуль.
При добавлении нового элемента Qt нужно пересобрать SDK и образ
mcom02-buildroot-sdcard.img (далее - sdcard.img
). Новый
sdcard.img
нужно загрузить на модуль.
Далее в руководстве будет использовано обозначение ARCH
.
- Для 1892ВМ14Я это
arm
. - Для СКИФ это
aarch64
.
Для совместимости с командами из этого ру ководства можно выполнить команду:
export ARCH=xxx # где xxx - выбранная архитектура.
После успешной сборки в директории buildroot/output/images/
создастся
архив ARCH-buildroot-linux-*_sdk-buildroot.tar.gz
.
Разработка Qt-приложений
Под готовка ПК для разработки приложений с GUI Qt:
- Создать папку
~/cross-compile
- Скопировать в нее архив с тулчейном и распаковать.
mkdir ~/cross-compile && cd ~/cross-compile
cp <path_to_buildroot_images>/$ARCH-buildroot-linux-*_sdk-buildroot.tar.gz .
tar xzpf $ARCH-buildroot*.tar.gz
Пути в файлах тулчейна остались относительно директории на ПК, где
выполнялась сборка. Выполнить relocate
:
cd ~/cross-compile/$ARCH-buildroot-linux-*_sdk-buildroot
./relocate-sdk.sh
Теперь пути установлены верные.
Основные элементы, которые нам понадобятся для настройки Qt creator:
- SysRoot
-
~/cross-compile/$ARCH-buildroot-linux-*_sdk-buildroot/$ARCH-buildroot-linux-*/sysroot
- GCC
-
~/cross-compile/$ARCH-buildroot-linux-*_sdk-buildroot/bin/$ARCH-buildroot-linux-*-gcc
- G++
-
~/cross-compile/$ARCH-buildroot-linux-*_sdk-buildroot/bin/$ARCH-buildroot-linux-*-g++
- qmake
-
~/cross-compile/$ARCH-buildroot-linux-*_sdk-buildroot/bin/qmake
Вместо *
— gnu
для СКИФ и gnueabihf
для 1892ВМ14Я.
Настройка Qt Creator
Установка
Скачать Qt Creator open-source можно в магазине приложений ОС (например "GNOME Центр приложений"), в пакетном менеджере ОС, с зеркала, либо с официального сайта с VPN.
Пример команды для загрузки в Linux:
wget http://www.mirrorservice.org/sites/download.qt-project.org/\
official_releases/qt/5.9/5.9.9/qt-opensource-linux-x64-5.9.9.run
Для установки без регистрации:
- Выключить интернет.
- Запустить
./qt-opensource-linux-x64-5.9.9.run
Версия 5.9 стала последней, где возможна оффлайн-установка.
Или с помощью пакетного менеджера (пример для Ubuntu/Debian):
sudo apt install qtcreator
Создать Kit
Пути до элементов Sysroot
, GCC/G++
, qmake
были указаны выше.
-
Tools --> Options --> Kits
-
Во вкладке
Kits
выбратьAdd
-
Ввести название, например
Smarc
–Apply
-
На вкладке
Qt Versions
Add
-
Указать путь до qmake, назвать
Qt-mcom03
/Qt-mcom02
. -
На вкладке
Compilers
Add --> GCC --> C++
-
Назвать
mcom03-G++
/mcom02-G++
-
В Compiler Path указать путь до G++
-
Аналогично добавить компилятор GCC
-
Вернуться на вкладку
Kits
, заполнить оставшиеся поля:- СКИФ
- 1892ВМ14Я
- Device Type:
Generic Linux Device
. - Sysroot:
<Path/to/sysroot>
. - Compiler: C:
mcom03-GCC
, C++:mcom03-G++
. - Qt-version
Qt-mcom03
.
- Device Type:
Generic Linux Device
. - Sysroot:
<Path/to/sysroot>
. - Compiler: C:
mcom02-GCC
, C++:mcom02-G++
. - Qt-version
Qt-mcom02
.
-
Сохранить настройки –
Apply
.
- СКИФ
- 1892ВМ14Я
Создать проект
File --> New File or Project --> Qt Widget Application --> Choose
- Задать имя проекта и путь расположения
- Build system –
qmake
- Далее
Next
до этапа Kits: выбрать созданныйKit
Next --> Finish
Проект создан
Projects --> Build Settings
- При желании переопределить
build directory
. - Собрать проект – "Молоток" в нижнем углу.
Сборка без Qt Creator в консоли
-
Перейти в директорию с проектом (в ней должен быть файл
*.pro
) -
Создать переменную окружения, например
CROSS
:export CROSS=$HOME/cross-compile/$ARCH-buildroot-linux-*_sdk-buildroot/bin
Вместо
*
—gnu
для СКИФ иgnueabihf
для 1892ВМ14Я. -
Запустить qmake:
$CROSS/bin/qmake <filename>.pro
-
Сгенерируется Makefile
-
make
После сборки в этой же директории будет исполняемый файл.
Важные моменты при создании проекта
Добавить перехватчик сигнала SIGINT
в main():
signal(SIGINT, signalHandler);
void signalHandler(int param)
{
std::cout <<"SIGINT\n";
QApplication::exit(0);
}
- СКИФ
- 1892ВМ14Я
В конструктор дочернего от QMainWindow класса добавить:
std::ofstream ttyBind;
ttyBind.open("/sys/class/vtconsole/vtcon0/bind");
if (ttyBind.is_open()) ttyBind << "0";
Запись 0 в /sys/class/vtconsole/vtcon0/bind
отключает вывод консоли на HDMI монитор.
В деструктор этого же класса:
std::cout << "Exit application.\n";
std::ofstream ttyBind;
ttyBind.open("/sys/class/vtconsole/vtcon0/bind");
if (ttyBind.is_open()) ttyBind << "1";
В main.cpp -> main()
yстановить атрибут выше строки QApplication a(argc, argv);
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
В класс-наследник от QMainWindow добавить:
std::ofstream ttyBind;
ttyBind.open("/sys/class/vtconsole/vtcon1/bind");
if (ttyBind.is_open()) ttyBind << "0";
Запись 0 в /sys/class/vtconsole/vtcon1/bind
отключает вывод консоли на
HDMI монитор.
В деструктор этого же класса:
std::cout << "Exit application.\n";
std::ofstream ttyBind;
ttyBind.open("/sys/class/vtconsole/vtcon1/bind");
if (ttyBind.is_open()) ttyBind << "1";
Запись 1 возвращает нормальную работу консоли.
Чтобы сделать правильный выход из приложения по Ctrl+C
нужно
самостоятельно реализовать обработку этой комбинации.
Образец проекта можно скачать
Добавление курсора
-
Выбрать png изображение (32x32)
-
Конвертировать его в формат XPM
-
Полученное изображение добавить в РесурсыQt.
-
Для изображения курсора можно определить псевдоним, например
x-cursor
-
В таком случае получить его можно следующим образом:
QPixmap cursor_pixmap = QPixmap(":x-cursor");
QCursor cursor = QCursor(cursor_pixmap,0,0);
QApplication::setOverrideCursor(cursor);
Запуск на отладочном модуле
- SMARC-R / SMARC-CB
- Салют-ЭЛ24ОМ1
Запуск на отладочном модуле
Подготовка носителя ОС. Прошивка SD-карты. https://dist.elvees.com/mcom03/docs/linux-sdk/latest/components/buildroot.html#sd
Для корректной работы нижеперечисленные компоненты должны быть из одного релиза:
rootfs.tar.gz
– мы собрали (сборка базируется на mcom03-defconfig-src из релиза).- SDK – мы собрали командой
make sdk
. - sbl.bin – из релиза с dist.elvees.com.
Прошивка sbl.
- Подключить HDMI-монитор, USB клавиатуру и мышь.
- Запустить модуль.
Скопировать исполняемый файл на модуль (с хоста):
scp example root@<board_ip>:/root
scp qt-env.sh root@<board_ip>:/root
Запуск выполняется из Weston desktop shell
# выбрать платформу
export QT_QPA_PLATFORM=wayland
# задать путь до шрифтов
export QT_QPA_FONTDIR=/usr/share/fonts/dejavu/
systemctl start mcom03-weston # Если не был ранее запущен
cd /root
source qt-env.sh
./example
systemctl start mcom03-weston # Если не был ранее запущен
source /root/qt-env.sh
cd /lib/qt/examples/
./gui/analogclock/analogclock
Запуск на комплекте отладочном Салют-ЭЛ24ОМ1 + Салют-ЭЛ24ПМ2
Подготовка носителя ОС. Прошивка SD-карты https://dist.elvees.com/mcom02/buildroot/nightly/latest/docs/html/buildroot-manual/index.html#id17.
Для корректной работы SD карту надо прошить sdcard.img
из той же сборки, что и SDK. U-boot
можно взять и прошить из
стандартной сборки
- Подключить HDMI-монитор, USB клавиатуру и мышь.
- Запустить модуль.
Скопировать исполняемый файл на модуль (с хоста):
scp example root@<board_ip>:/root
scp qt-env.sh root@<board_ip>:/root
# включить eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_mali
# задать путь до шрифтов
export QT_QPA_FONTDIR=/usr/share/fonts/ubuntu/
# установка разрешения экрана
export QT_QPA_EGLFS_PHYSICAL_WIDTH=1920
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=1080
Для удобства запуска можно создать bash-скрипт. Образец скрипта в архиве с примером проекта.
cd /root
source qt-env.sh
./example
Если программа запускается с удаленного терминала (SSH или UART),
виртуальный терминал (vtconsole on /dev/tty
) все равно будет получа ть
события клавиатуры.
При запуске с VT Qt-программа перехватывает и отключает ввод на
/dev/tty
. В связи с этим нужно реализовать выход из программы вручную.
Скачать Qt-проект
- СКИФ
- 1892ВМ14Я