HMI
Qt on the Raspberry Pi 4

Qt is often used to develop graphic interfaces. Qt contains C ++ libraries for creating graphical interfaces that can be compiled on various operating systems.
Since this compilation requires a lot of computing power, it is advisable for processors with relatively little power to carry out the development and compilation on a host computer and only then to load the finished application onto the target computer.
There are lots of instructions online for developing a Qt application for Raspberry Pi 3 and Pi 4 models. Unfortunately, I couldn't find one that worked flawlessly for the Raspberry Pi 4. These instructions are based on https://www.kampis-elektroecke.de/raspberry-pi/qt/ and are modified in some places so that it worked for me.
Version 5.14.1 is used for Qt, and I use an Ubuntu 18 LTS that is installed in vmware as the host computer for cross-compilation.

Preparing the Raspberry Pi 4

For the basic installation, we need a Raspbian operating system on the Pi 4. I used "2020-02-13-raspbian-buster-lite.img". Downloads and instructions on how to create an SD card with this can be found at https://www.raspberrypi.org/downloads/raspbian/. After switching on the Pi 4, the configuration menu appears, where you can make various settings (e.g., host name, IP address, etc.). For our configuration, we need "SSH" and "GL (Fake KMS)". See the following two screenshots.

SSH Konfiguration

FKMS Konfiguration

  • Then enter development sources in /etc/apt/sources.list. Add the following line:
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
  • Then update the system with the following commands:
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
sudo rpi-update
sudo reboot
  • And then install the required Qt and development packages:
sudo apt-get build-dep qt5-qmake
sudo apt-get build-dep libqt5gui5
sudo apt-get build-dep libqt5webengine-data
sudo apt-get build-dep libqt5webkit5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver

Important: Do not create or modify symlinks for EGL and GLES libraries as described in some instructions. - Then also create a directory for RaspberryQt:

sudo mkdir /usr/local/RaspberryQt
sudo chown -R pi:pi /usr/local/RaspberryQt

Preparing Ubuntu

  • Update software and install additional packages:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc git bison python gperf pkg-config gdb-multiarch
  • Generate ssh key for Raspberry and install it on Raspberry:
ssh-keygen -t rsa -C [email protected] -P "" -f ~/.ssh/rpi_root_id_rsa
ssh-keygen -t rsa -C [email protected] -P "" -f ~/.ssh/rpi_pi_id_rsa
cat ~/.ssh/rpi_root_id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys && chmod 640 .ssh/authorized_keys'
cat ~/.ssh/rpi_pi_id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys && chmod 640 .ssh/authorized_keys'
  • Download gcc compiler, Qt and symlink script:
mkdir /opt/RaspberryQt
cd /opt/RaspberryQt
wget http://download.qt.io/archive/qt/5.14/5.14.1/single/qt-everywhere-src-5.14.1.tar.xz
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
  • The files include the cross-compiler for the Raspberry Pi, the Qt version used (here: 5.14.1), and a Python script for replacing symbolic links of files with relative links (will be needed later).
  • Download the gcc compiler "rpi-gcc-8.3.0_linux.tar.xz" from https://bugfreeblog.page.link/rasplinuxgcc830 and extract it into the tools directory
  • The Qt version will then be extracted, and the name of the compiler used (here: arm-linux-gnueabihf) will be adjusted in the Qt configuration file.
tar xf qt-everywhere-src-5.14.1.tar.xz
cp -R qt-everywhere-src-5.14.1/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.14.1/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.14.1/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf
  • Create working directories:
sudo mkdir /opt/RaspberryQt
sudo mkdir /opt/RaspberryQt/build
sudo mkdir /opt/RaspberryQt/sysroot
sudo mkdir /opt/RaspberryQt/sysroot/usr
sudo mkdir /opt/RaspberryQt/sysroot/opt
sudo chown -R 1000:1000 /opt/RaspberryQt
  • The libraries used by the target machine (here: the Raspberry Pi) are also required. These can be downloaded from the Raspberry Pi using rsync.
rsync -avz [email protected]:/lib sysroot
rsync -avz [email protected]:/usr/include sysroot/usr
rsync -avz [email protected]:/usr/lib sysroot/usr
rsync -avz [email protected]:/opt/vc sysroot/opt
  • However, before the files can be used, the symbolic links that still point to the file system of the Raspberry Pi must be replaced by relative links from the new sysroot directory. This is done using the downloaded Python script:
sudo chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot
  • Finally, Qt is also configured:
cd /opt/RaspberryQt/build
../qt-everywhere-src-5.14.1/configure -release -opengl es2  -eglfs -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=/opt/RaspberryQt/tools/rpi-gcc-8.3.0/bin/arm-linux-gnueabihf- -sysroot /opt/RaspberryQt/sysroot -prefix /usr/local/RaspberryQt -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -nomake examples -make libs -pkg-config -no-use-gold-linker -v -recheck
make -j4
make install
  • The fully compiled Qt libraries are then copied to the Raspberry Pi using rsync:
cd /opt/RaspberryQt
rsync -avz sysroot/usr/local/RaspberryQt [email protected]:/usr/local

Installing Qt Creator

The best way to develop Qt applications is to use Qt Creator. To install it, please download and run the online installation files from the Qt website.

Updated version

Updates to this blog post have been provided in a series of 3 blog posts: