Перейти к основному содержимому

Запуск Qt-приложений

Собрать Qt-приложение можно как в IDE Qt Creator, так и без неё. Будут продемонстрированы оба способа сборки.

Запуск приложений возможен несколькими способами:

  • С использованием оконной системы Wayland.
  • Через Framebuffer.
dia
Схема возможных вариантов запуска

В данном руководстве описан только способ запуcка через Wayland.

Сборка приложения выполняется на хосте. Для этого нужен кросс-компилятор и образ для запуска на модуле.

Сборка кросс-компилятора и образа прошивки SD

Подготовка

  • Установить docker (см. мануалы на Вашу ОС).
  • Добавить пользователя ОС в группу docker (usermod -a -G docker $USER).
  • Требуется доступ в Интернет (необходимо проверить настройки сети и/или корпоративных прокси).
  • Свободного места на диске должно быть более 30ГБ.

В этом разделе мы будем собирать кросс-компилятор arm-mcom03. Он нужен для сборки приложений на хосте под тагрет-систему.

Конфигурация Buildroot

Потребуется архив с 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
warning

Необходимо установить и настроить 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!

Добавить QWidgets

widgets по умолчанию не включены в defconfig:

make menuconfig

Там же можно включить и другие необходимые компоненты

qt-conf
Скриншот доступных элементов menuconfig

Добавить python-пакет (опционально)

Дополнительно включить 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

Сборка

./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'
подсказка

При добавлении нового элемента Qt нужно пересобрать SDK и образ rootfs.tar.gz (далее - rootfs). Новый rootfs нужно загрузить на модуль.

warning

Далее в руководстве будет использовано обозначение 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

Для установки без регистрации:

  1. Выключить интернет.
  2. Запустить ./qt-opensource-linux-x64-5.9.9.run

Версия 5.9 стала последней, где возможна оффлайн-установка.

Или с помощью пакетного менеджера (пример для Ubuntu/Debian):

sudo apt install qtcreator

Создать Kit

Пути до элементов Sysroot, GCC/G++, qmake были указаны выше.

  1. Tools --> Options --> Kits

  2. Во вкладке Kits выбрать Add

  3. Ввести название, например SmarcApply

  4. На вкладке Qt Versions Add

  5. Указать путь до qmake, назвать Qt-mcom03 / Qt-mcom02.

  6. На вкладке Compilers Add --> GCC --> C++

  7. Назвать mcom03-G++ / mcom02-G++

  8. В Compiler Path указать путь до G++

  9. Аналогично добавить компилятор GCC

  10. Вернуться на вкладку Kits, заполнить оставшиеся поля:

    • Device Type: Generic Linux Device.
    • Sysroot: <Path/to/sysroot>.
    • Compiler: C: mcom03-GCC, C++: mcom03-G++.
    • Qt-version Qt-mcom03.
  11. Сохранить настройки – Apply.

Создать проект

  1. File --> New File or Project --> Qt Widget Application --> Choose
  2. Задать имя проекта и путь расположения
  3. Build system – qmake
  4. Далее Next до этапа Kits: выбрать созданный Kit
  5. Next --> Finish

Проект создан

  • Projects --> Build Settings
  • При желании переопределить build directory.
  • Собрать проект – "Молоток" в нижнем углу.

Сборка без Qt Creator в консоли

  1. Перейти в директорию с проектом (в ней должен быть файл *.pro)

  2. Создать переменную окружения, например CROSS:

    export CROSS=$HOME/cross-compile/$ARCH-buildroot-linux-*_sdk-buildroot/bin

    Вместо *gnu для СКИФ и gnueabihf для 1892ВМ14Я.

  3. Запустить qmake:

    $CROSS/bin/qmake <filename>.pro
  4. Сгенерируется Makefile

  5. make

После сборки в этой же директории будет исполняемый файл.

Важные моменты при создании проекта

Добавить перехватчик сигнала SIGINT в main():

signal(SIGINT, signalHandler);
Реализация перехватчика
void signalHandler(int param)
{
std::cout <<"SIGINT\n";
QApplication::exit(0);
}

В конструктор дочернего от 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";

Запись 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);

Запуск на отладочном модуле

Запуск на отладочном модуле

к сведению

Подготовка носителя ОС. Прошивка 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
Запуск встроенных примеров (если были включены при сборке Buildroot)
systemctl start mcom03-weston # Если не был ранее запущен
source /root/qt-env.sh
cd /lib/qt/examples/
./gui/analogclock/analogclock

Скачать Qt-проект