- Запуск Qt-приложений
- Сборка кросс-компилятора и образа прошивки SD
- Конфигурация buildroot
- Добавить QWidgets
- Включить Event-ы в ядре Linux
- Сборка
- Разработка Qt-приложений
- Настройка Qt Creator
- Сборка без Qt Creator
- Важные моменты при создании проекта
- Добавление курсора
- Запуск на комплекте отладочном Салют-ЭЛ24ОМ1 + Салют-ЭЛ24ПМ2
Запуск Qt-приложений
Собрать Qt-приложение можно как в IDE Qt Creator, так и без неё. Будут продемонстрированы оба способа сборки.
Запуск приложений возможен несколькими способами:
- С использованием оконной системы (например X11).
- Через OpenGL.
- Через Framebuffer.
В данном руководстве описан только способ запуcка через OpenGL — EGLFS.
Запуск встроенных Qt-примеров на модулях Салют Linux test guide п. 3.8.
Сборка приложения выполняется на хосте. Для этого нужен кросс-компилятор и образ для запуска на модуле.
Сборка кросс-компилятора и образа прошивки SD
Для сборки приложения нужен кросс-компилятор arm-mcom02. Qt уже включен в defconfig mcom_defconfig .
Конфигурация buildroot
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:
Добавить QWidgets
widgets по умолчанию не включены в defconfig:
Target packages ‣ Graphic libraries and applications‣Qt5‣widgets module‣Y
Там же можно включить и другие необходимые компоненты
Включить Event-ы в ядре Linux
Event-ы требуются, если в приложении нужно получать события устройств ввода, например, клавиатуру, мышь, тачпад и т.д.
Device Drivers ‣ Input device support ‣ Event interface ‣ Y
Сборка
make linux-rebuild && \ make sdk && \ make
make sdk выполняет сборку переносимого тулчейна c ARM-компилятором для 1892ВМ14Я. Дальнейшая работа будет демонстрироваться с этим тулчейном.
Это полезно, если сборка buildroot выполняется на одном ПК, а разработка Qt приложения — на другом.
Если нужно что-нибудь включить в сборку, то чтобы не пересобирать все с нуля: make -rebuild :
#например make qt5base-rebuild make sdk-rebuild make
При добавлении нового элемента Qt нужно пересобрать SDK и образ mcom02-buildroot-sdcard.img (далее — sdcard.img ). Новый sdcard.img нужно загрузить на модуль.
После успешной сборки в директории buildroot/output/images/ создастся архив arm-buildroot-linux-gnueabihf_sdk-buildroot.tar.gz .
Разработка Qt-приложений
Подготовка ПК для разработки приложений с GUI Qt:
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 стала последней, где возможна оффлайн-установка.
Для установки без регистрации:
Пути до элементов Sysroot , GCC/G++ , qmake были указаны выше.
- Tools ‣ Options ‣ Kits
- Во вкладке Kits выбрать Add
- Ввести название, например Salute-EL24 Apply
- На вкладке Qt Versions Add
- Указать путь до qmake, назвать Qt-mcom02 .
- Device Type: Generic Linux Device .
- Sysroot: .
- Compiler: C: mcom02-GCC , C++: mcom02-G++ .
- Qt-version Qt-mcom02 .
- File ‣ New File or Project ‣ Qt Widget Application ‣ Choose
- Задать имя проекта и путь расположения
- Build system — qmake
- Далее Next до этапа Kits:выбрать Salute-EL24
Проект создан.
- Projects ‣ Build Settings
- При желании переопределить build directory .
- Собрать проект — «Молоток» в нижнем углу.
Сборка без Qt Creator
- Перейти в директорию с проектом (в ней должен быть файл *.pro )
- Создать переменную окружения, например CROSS :
export CROSS=$HOME/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
После сборки в этой же директории будет исполняемый файл.
Важные моменты при создании проекта
В 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 изображение (32×32)
- Конвертировать его в формат 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 можно взять и прошить из стандартной сборки
Скопировать исполняемый файл на модуль (с хоста):
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-скрипт. Образец скрипта в архиве с примером проекта.
Если программа запускается с удаленного терминала (SSH или UART), виртуальный терминал (vtconsole on /dev/tty ) все равно будет получать события клавиатуры.
При запуске с VT Qt-программа перехватывает и отключает ввод на /dev/tty . В связи с этим нужно реализовать выход из программы вручную.