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

Открыть PDF версию

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

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

  • С использованием оконной системы (например X11).

  • Через OpenGL.

  • Через Framebuffer.

../../_images/ogl-diagram.png

Рисунок 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

Target packages ‣ Graphic libraries and applications‣Qt5‣widgets module‣Y

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

../../_images/menuconfig-qt.png

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

Включить Event-ы в ядре Linux

Event-ы требуются, если в приложении нужно получать события устройств ввода, например, клавиатуру, мышь, тачпад и т.д.

make linux-menuconfig

Device Drivers ‣ Input device support ‣ Event interface ‣ Y

Сборка

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 стала последней, где возможна оффлайн-установка.

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

  1. Выключить интернет.

  2. Запустить ./qt-opensource-linux-x64-5.9.9.run

Создать Kit

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

  1. Tools ‣ Options ‣ Kits

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

  3. Ввести название, например Salute-EL24 Apply

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

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

    ../../_images/qt-name.png
  6. На вкладке Compilers Add ‣ GCC ‣ C++

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

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

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

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

    • Device Type: Generic Linux Device.

    • Sysroot: <Path/to/sysroot>.

    • Compiler: C: mcom02-GCC, C++: mcom02-G++.

    • Qt-version Qt-mcom02.

  11. Сохранить настройки Apply.

../../_images/kits-final.png

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

  1. File ‣ New File or Project ‣ Qt Widget Application ‣ Choose

  2. Задать имя проекта и путь расположения

  3. Build system — qmake

  4. Далее Next до этапа Kits:выбрать Salute-EL24

    ../../_images/create-proj.png
  5. Next ‣ Finish

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

  • Projects ‣ Build Settings

  • При желании переопределить build directory.

  • Собрать проект — «Молоток» в нижнем углу.

../../_images/build.png

Сборка без Qt Creator

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

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

    export CROSS=$HOME/cross-compile/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
    
  3. Запустить qmake:

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

  5. 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. В связи с этим нужно реализовать выход из программы вручную.

Открыть PDF версию