Запуск Qt-приложений
Собрать Qt-приложение можно как в IDE Qt Creator, так и без неё. Будут продемонстрированы оба способа сборки.
Запуск приложений возможен несколькими способами:
- СКИФ
- 1892ВМ14Я
- С использованием оконной системы (например X11).
- Через Framebuffer.
- С использованием оконной системы (например X11).
- Через OpenGL.
- Через Framebuffer.
- СКИФ
- 1892ВМ14Я
В данном руководстве описан только способ запуcка через Linux FrameBuffer.
В данном руководстве описан только способ запуcка через OpenGL - EGLFS.
Сборка приложения выполняется на хосте. Для этого нужен кросс-компилятор и образ для запуска на модуле.
Сборка кросс-компилятора и образа прошивки SD
- СКИФ
- 1892ВМ14Я
Для сборки приложения нужен кросс-компилятор arm-mcom03.
Для сборки приложения нужен кросс-компилятор arm-mcom02. Qt уже включен
в defconfig mcom_defconfig
.
Конфигурация buildroot
- СКИФ
- 1892ВМ14Я
Потребуется архив с 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
Потребуется архив с 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
Там же можно включить и другие необходимые компоненты
Добавить python-пакет (опционально)
- СКИФ
- 1892ВМ14Я
Сборка
make sdk && \
make
make sdk
выполняе т сборку переносимого тулчейна c ARM-компилятором для целевой платы.
Дальнейшая работа будет демонстрироваться с этим тулчейном.
Это полезно, если сборка buildroot выполняется на одном ПК, а разработка Qt приложения – на другом.
Если нужно что-нибудь включить в сборку, то чтобы не пересобирать все с
нуля: make <package>-rebuild
:
make qt5base-rebuild && \
make python-rebuild && \
make dejavu && \
make sdk && \
make
- СКИФ
- 1892ВМ14Я
При добавлении нового элемента Qt нужно пересобрать SDK и образ
rootfs.tar.gz (далее - rootfs
). Новый rootfs
нужно загрузить на модуль.
При добавлении нового элемента Qt нужно пересобрать SDK и образ
mcom02-buildroot-sdcard.img (далее - sdcard.img
). Новый
sdcard.img
нужно загрузить на модуль.
После успешной сборки в директории 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
Для установки без регистрации:
- Выключить интернет.
- Запустить
./qt-opensource-linux-x64-5.9.9.run
Версия 5.9 стала последней, где возможна оффлайн-установка.
Создать Kit
Пути до элементов Sysroot
, GCC/G++
, qmake
были указаны выше.
-
Tools --> Options --> Kits
-
Во вкладке
Kits
выбратьAdd
-
Ввести название, например
Smarc
–Apply
-
На вкладке
Qt Versions
Add
-
Указать путь до qmake, назвать
Qt-mcom03
/Qt-mcom02
. -
На вкладке
Compilers
Add --> GCC --> C++
-
Назвать
mcom03-G++
/mcom02-G++
-
В Compiler Path указать путь до G++
-
Аналогично добавить компилятор GCC
-
Вернуться на вкладку
Kits
, заполнить оставшиеся поля:- СКИФ
- 1892ВМ14Я
- Device Type:
Generic Linux Device
. - Sysroot:
<Path/to/sysroot>
. - Compiler: C:
mcom03-GCC
, C++:mcom03-G++
. - Qt-version
Qt-mcom03
.
- Device Type:
Generic Linux Device
. - Sysroot:
<Path/to/sysroot>
. - Compiler: C:
mcom02-GCC
, C++:mcom02-G++
. - Qt-version
Qt-mcom02
.
-
Сохранить настройки –
Apply
.
- СКИФ
- 1892ВМ14Я
Создать проект
File --> New File or Project --> Qt Widget Application --> Choose
- Задать имя проекта и путь расположения
- Build system –
qmake
- Далее
Next
до этапа Kits: выбрать созданныйKit
Next --> Finish
Проект создан
Projects --> Build Settings
- При желании переопределить
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
После сборки в этой же директории будет исполняемый файл.
Важные моменты при создании проекта
Добавить перехватчик сигнала SIGINT
в main():
signal(SIGINT, signalHandler);
void signalHandler(int param)
{
std::cout <<"SIGINT\n";
QApplication::exit(0);
}
- СКИФ
- 1892ВМ14Я
В конструктор дочернего от 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";
В main.cpp -> main()
yстановить атрибут выше строки QApplication a(argc, argv);
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
В класс-наследник от 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);
Запуск на отладочном модуле
- SMARC-R
- Салют-ЭЛ24ОМ1
Запуск на отладочном модуле 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/
Запуск на комплекте отладочном Салют-ЭЛ24ОМ1 + Салют-ЭЛ24ПМ2
Подготовка носителя ОС. Прошивка SD-карты https://dist.elvees.com/mcom02/buildroot/nightly/latest/docs/html/buildroot-manual/index.html#id17.
Для корректной работы SD карту надо прошить sdcard.img
из той же сборки, что и SDK. U-boot
можно взять и прошить из
стандартной сборки
- Подключить HDMI-монитор, USB клавиатуру и мышь.
- Запустить модуль.
Скопировать исполняемый файл на модуль (с хоста):
scp example root@<board_ip>:/root
# включить 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 /root
./example
Если программа запускается с удаленного терминала (SSH или UART),
виртуальный терминал (vtconsole on /dev/tty
) все равно будет получать
события клавиатуры.
При запуске с VT Qt-программа перехватывает и отключает ввод на
/dev/tty
. В связи с этим нужно реализовать выход из программы вручную.
Скачать Qt-проект
- СКИФ
- 1892ВМ14Я