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

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

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

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

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

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

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

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

Для сборки приложения нужен кросс-компилятор arm-mcom03.

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

Потребуется архив с buildroot (последнего релиза):

wget https://dist.elvees.com/mcom03/buildroot/2023.03/rockpi/mcom03-defconfig-src.tar.gz && \
tar xzpf mcom03-buildroot*.tar.gz && \
cd mcom03-defconfig-src
предупреждение

Данное руководство не описывает процесс подготовки ПК к запуску buildroot. Необходимо ознакомиться с Руководством. И продолжить после того, как все подготовительные этапы пройдены.

Применить файл конфигурации (пример для модуля ELV-MC03-SMARC-R):

make mcom03_defconfig FRAGMENTS=rockpi

Добавить QWidgets

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

make menuconfig

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

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

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

Добавить шрифты DejaVu

Сборка

make sdk && \
make

make sdk выполняет сборку переносимого тулчейна c ARM-компилятором для целевой платы. Дальнейшая работа будет демонстрироваться с этим тулчейном.

Это полезно, если сборка buildroot выполняется на одном ПК, а разработка Qt приложения – на другом.

Если нужно что-нибудь включить в сборку, то чтобы не пересобирать все с нуля: make <package>-rebuild:

make qt5base-rebuild && \
make python-rebuild && \
make dejavu && \
make sdk && \
make
подсказка

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

После успешной сборки в директории 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

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

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

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

Создать 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/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
  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);

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

Запуск на отладочном модуле ELV-MC03-SMARC-R (RockPI-N10)

к сведению

Подготовка носителя ОС. Прошивка SD-карты. https://dist.elvees.com/mcom03/docs/linux-sdk/latest/components/buildroot.html#sd

предупреждение

Для корректной работы SD карту надо прошить rootfs.tar.gz из той же сборки, что и SDK. Sbl можно взять и прошить из той-же сборки.

  • Подключить HDMI-монитор, USB клавиатуру и мышь.
  • Запустить модуль.

Скопировать исполняемый файл на модуль (с хоста):

scp example root@<board_ip>:/root
Установить переменные окружения
# включить linuxfb
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0

# задать путь до шрифтов
export QT_QPA_FONTDIR=/usr/share/fonts/dejavu/

Для удобства запуска можно создать bash-скрипт. Образец скрипта в архиве с примером проекта.

Запуск
cd /root
./example

Если программа запускается с удаленного терминала (SSH или UART), виртуальный терминал (vtconsole on /dev/tty) все равно будет получать события клавиатуры.

При запуске с VT Qt-программа перехватывает и отключает ввод на /dev/tty. В связи с этим нужно реализовать выход из программы вручную.

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