Запуск Qt-приложений
Собрать Qt-приложение можно как в IDE Qt Creator, так и без неё. Будут продемонстрированы оба способа сборки.
Запуск приложений возможен несколькими способами:
С использованием оконной системы (например X11).
Через OpenGL.
Через Framebuffer.

Рисунок 11 Схема возможных вариантов запуска Qt-приложений
В данном руководстве описан только способ запуcка через OpenGL - EGLFS.
См.также
Запуск встроенных Qt-примеров на модулях Салют Linux test guide п. 3.8.
Сборка приложения выполняется на хосте. Для этого нужен кросс-компилятор и образ для запуска на модуле.
Сборка кросс-компилятора и образа прошивки SD
Для сборки приложения нужен кросс-компилятор arm-mcom02.
Qt уже включен в defconfig mcom_defconfig
.
Конфигурация buildroot
Потребуется архив с 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
Там же можно включить и другие необходимые компоненты

Рисунок 12 Скриншот доступных элементов в menuconfig
Включить Event-ы в ядре Linux
Event-ы требуются, если в приложении нужно получать события устройств ввода, например, клавиатуру, мышь, тачпад и т.д.
make linux-menuconfig
Сборка
make linux-rebuild && \
make sdk && \
make
make sdk выполняет сборку переносимого тулчейна c ARM-компилятором для 1892ВМ14Я. Дальнейшая работа будет демонстрироваться с этим тулчейном.
Это полезно, если сборка buildroot выполняется на одном ПК, а разработка Qt приложения — на другом.
Если нужно что-нибудь включить в сборку, то чтобы не пересобирать все с нуля:
make <package>-rebuild
:
#например
make qt5base-rebuild
make sdk-rebuild
make
Важно
При добавлении нового элемента Qt нужно пересобрать SDK и образ
mcom02-buildroot-sdcard.img (далее - sdcard.img
). Новый sdcard.img нужно загрузить на модуль.
Подробнее про buildroot: https://dist.elvees.com/mcom02/buildroot/nightly/latest/docs/html/
После успешной сборки в директории buildroot/output/images/
создастся архив arm-buildroot-linux-gnueabihf_sdk-buildroot.tar.gz
.
Разработка Qt-приложений
Подготовка ПК для разработки приложений с GUI Qt:
Создать папку
~/cross-compile
Скопировать в нее архив с тулчейном и распаковать.
mkdir ~/cross-compile && cd ~/cross-compile
cp <path_to_buildroot_images>/arm-buildroot-linux-gnueabihf_sdk-buildroot.tar.gz .
tar xzpf arm-buildroot*.tar.gz
Пути в файлах тулчейна остались относительно директории на ПК,
где выполнялась сборка. Выполнить relocate
:
cd ~/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot
./relocate-sdk.sh
Теперь пути установлены верные.
Основные элементы, которые нам понадобятся для настройки Qt creator:
SysRoot -
~/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot
GCC -
~/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-gcc
G++ -
~/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-g++
qmake -
~/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/qmake
Настройка Qt Creator
Установка
Скачать qt-creator open-source можно с зеркала, либо с официального сайта с 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
Версия 5.9 стала последней, где возможна оффлайн-установка.
Для установки без регистрации:
Выключить интернет.
Запустить
./qt-opensource-linux-x64-5.9.9.run
Создать Kit
Пути до элементов Sysroot
, GCC/G++
, qmake
были указаны выше.
Во вкладке
Kits
выбрать AddВвести название, например
Salute-EL24
ApplyНа вкладке
Qt Versions
AddУказать путь до qmake, назвать
Qt-mcom02
.На вкладке
Compilers
Назвать
mcom02-G++
В Compiler Path указать путь до G++
Аналогично добавить компилятор GCC
Вернуться на вкладку
Kits
, заполнить оставшиеся поля:Device Type:
Generic Linux Device
.Sysroot:
<Path/to/sysroot>
.Compiler: C:
mcom02-GCC
, C++:mcom02-G++
.Qt-version
Qt-mcom02
.
Сохранить настройки Apply.

Создать проект
Задать имя проекта и путь расположения
Build system —
qmake
Далее Next до этапа Kits:выбрать
Salute-EL24
Проект создан.
При желании переопределить
build directory
.Собрать проект — «Молоток» в нижнем углу.

Сборка без Qt Creator
Перейти в директорию с проектом (в ней должен быть файл
*.pro
)Создать переменную окружения, например
CROSS
:export CROSS=$HOME/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
Запустить qmake:
$CROSS/bin/qmake <filename>.pro
Сгенерируется Makefile
make
После сборки в этой же директории будет исполняемый файл.
Важные моменты при создании проекта
В main.cpp -> main()
yстановить атрибут до строки QApplication a(argc, argv);
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
Добавить перехватчик сигнала 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/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);
Запуск на комплекте отладочном Салют-ЭЛ24ОМ1 + Салют-ЭЛ24ПМ2
Примечание
Для корректной работы SD карту надо прошить sdcard.img
из той же сборки, что и SDK.
U-boot можно взять и прошить
из стандартной сборки
Подключить HDMI-монитор, USB клавиатуру и мышь.
Запустить модуль.
Скопировать исполняемый файл на модуль (с хоста):
scp example root@<board_ip>:/home
Установить переменные окружения:
# включить 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 /home
./example
Если программа запускается с удаленного терминала (SSH или UART),
виртуальный терминал (vtconsole on /dev/tty
) все равно будет получать события клавиатуры.
При запуске с VT Qt-программа перехватывает и отключает ввод на /dev/tty
.
В связи с этим нужно реализовать выход из программы вручную.