🖼️ Qt 6

Caution
La première version de ce tutoriel a été faite pour Qt 6.5.2. Je l’ai mise à jour pour Qt 6.6.0, mais je n’ai pas réenregistré les screenshots.
Description¶
- Origine 🌱 Qt est un framework de développement logiciel libre et open source, initialement développé par Trolltech en 1995, et qui a été racheté par Nokia, puis par Digia, qui est devenue par la suite The Qt Company.
- Finalité 🎯 Qt est principalement utilisé pour développer des applications avec une interface graphique (GUI), mais il est aussi très adapté pour le développement d'applications sans GUI. Il est célèbre pour son mécanisme de signaux et slots et pour son framework d'événements.
- Plateformes supportées 🌍 Une des grandes forces de Qt est sa capacité à être multiplateforme. Avec Qt, vous pouvez écrire une application une fois, puis la compiler et l'exécuter sur de multiples plateformes, telles que Windows, macOS, Linux, Android, iOS, et bien d'autres.
- Modules 🧩 Qt est organisé en différents modules. Certains des modules les plus populaires sont : QtCore (pour les fonctionnalités non-GUI de base), QtGui (fonctionnalités GUI de base), QtWidgets (widgets pour les applications de bureau), QtNetwork (fonctionnalités réseau), et bien d'autres.
- Qt Quick et QML 🚀 À partir de Qt 5, et renforcé dans Qt 6, Qt propose Qt Quick, un moyen de créer des interfaces utilisateur fluides et animées en utilisant le langage de déclaration QML. C'est particulièrement utile pour les applications mobiles et les appareils embarqués.
- Licence 📜 Qt est disponible sous différentes licences, dont la LGPL et la GPL, qui sont des licences open source, ainsi qu'une licence commerciale qui offre des avantages supplémentaires et une plus grande flexibilité, en particulier pour ceux qui ne veulent pas se conformer aux obligations des licences open source.
- Outils associés 🛠️ Qt vient avec plusieurs outils pour faciliter le développement, comme Qt Creator (un environnement de développement intégré), l'outil de conception d'interfaces (Qt Designer), et d'autres utilitaires pour la traduction, l'accès aux bases de données, et plus encore.
- Évolution vers Qt 6 ⏫ Qt 6, en tant que successeur de Qt 5, introduit de nombreuses améliorations, refactorisations et nouvelles fonctionnalités tout en supprimant certaines anciennes pour moderniser le framework. Il mise fortement sur l'amélioration de l'efficacité, l'intégration 3D, et la facilité d'utilisation pour les développeurs.
En résumé, Qt 6 est un framework puissant et polyvalent qui peut être utilisé pour développer des applications multiplateformes de haute qualité, qu'il s'agisse d'applications de bureau, mobiles, embarquées, ou même pour le web avec WebAssembly. C'est une solution de choix pour les développeurs cherchant à maximiser la portabilité et la réutilisabilité de leur code. 🌟🖥️📱
Remarques sur les obligations concernant l’open source¶
- Lire la page https://www.qt.io/licensing/open-source-lgpl-obligations Avec la licence LGPL, vous pouvez utiliser les bibliothèques essentielles et certaines supplémentaires de Qt tout en gardant le code source de votre application fermé, tant que toutes les exigences de LGPLv3 sont respectées. La page mentionne également les quatre libertés fournies par la licence LGPL, notamment la liberté d'exécuter, d'étudier, de redistribuer et d'améliorer le programme.
Linkage dynamique
On choisira, pour ne pas avoir de problème, un linkage dynamique (DLL ou SO).
On notera : - Fournir un mécanisme de re-linking pour les bibliothèques Qt (utilisation de DLL) - Fournir une copie de la licence et reconnaître explicitement l'utilisation de Qt - Mettre à disposition une copie du code source de Qt pour les clients - Accepter que les modifications du code source Qt ne sont pas propriétaires - Créer des appareils "ouverts" pour les consommateurs - Accepter les termes de la Gestion des Droits Numériques, veuillez consulter la FAQ GPL - Prendre en considération lors de la tentative d'application des brevets logiciels, voir la FAQ
Installation sur Windows¶
- S’inscrire en tant qu’utilisateur souhaitant utiliser la version open source https://www.qt.io/download-open-source
- Se rendre ici pour télécharger le logiciel https://www.qt.io/download-qt-installer-oss


- Installer le logiciel (dans mon cas
F:\Frameworks\Qt) - Vous pourrez ensuite tout gérer (installation/maj) avec l’application
MaintenanceTool.exe
Utilisation¶
CMakeLists.txt¶
cmake_minimum_required(VERSION 3.25)
project(QT_HelloWorld)
set(CMAKE_CXX_STANDARD 23)
# Tell cmake where Qt is located
set(QT_PREFIX_PATH "F:/Frameworks/Qt/6.8.2/msvc2022_64")
list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
# Tell CMake to find the Qt6Core and Qt6Widgets modules
find_package(Qt6 COMPONENTS Core Widgets REQUIRED)
# WIN32 is important to avoid the console windows
add_executable(QT_HelloWorld WIN32 main.cpp)
# Link the library to the executable
target_link_libraries(QT_HelloWorld Qt6::Core Qt6::Widgets)
# Before building, delete all DLLs from the output directory
add_custom_command(TARGET QT_HelloWorld PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_BINARY_DIR}/*.dll"
MESSAGE( "Deleting old DLLs...")
)
# After building the project, deploy the necessary DLLs to the output directory
set(QT_EXECUTABLE ${CMAKE_BINARY_DIR})
add_custom_command(TARGET QT_HelloWorld POST_BUILD
COMMAND "${QT_PREFIX_PATH}/bin/windeployqt.exe" ARGS ${QT_EXECUTABLE}
COMMENT "Deploying Qt dependencies..."
)
Test app¶
#include <QApplication>
#include <QPushButton>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QPushButton button("Bonjour Rémi !");
button.setFixedSize(400, 100);
button.show();
return app.exec();
}

Unicode
Comme vous le remarquez, Qt gère l’Unicode convenablement. Cependant, je vous invite sous Windows à ajouter le BOM. Le BOM, ou Byte Order Mark, est un caractère Unicode utilisé pour signaler l'ordre des octets (endianness) dans un texte codé en UTF-16 ou UTF-32.


Installation sur Linux GUI¶
- S’inscrire en tant qu’utilisateur souhaitant utiliser la version open source https://www.qt.io/download-open-source
- Se rendre ici pour télécharger le logiciel https://www.qt.io/download-qt-installer-oss
sudo apt-get install libxcb-xinerama0
chmod +x ./qt-unified-linux-x64-4.6.1-online.run
./qt-unified-linux-x64-4.6.1-online.run
sudo apt-get install -y libgl1-mesa-dev libxcb-cursor0


- Installer le logiciel (dans mon cas
/home/remi/Frameworks/Qt)
Utilisation¶
CMakeLists.txt¶
cmake_minimum_required(VERSION 3.25)
project(QT_HelloWorld)
set(CMAKE_CXX_STANDARD 23)
# Tell CMake where Qt is located
set(QT_PREFIX_PATH "/home/remi/Frameworks/Qt/6.8.2/gcc_64")
list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
find_package(Qt6 COMPONENTS Core Widgets REQUIRED)
add_executable(QT_HelloWorld main.cpp)
# Link the library to the executable
target_link_libraries(QT_HelloWorld Qt6::Core Qt6::Widgets)
# Before building, delete all .so files from the output directory
add_custom_command(TARGET QT_HelloWorld PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E remove "${CMAKE_CURRENT_BINARY_DIR}/*.so"
COMMENT "Deleting old .so files..."
)
add_custom_command(TARGET QT_HelloWorld POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${QT_PREFIX_PATH}/lib/libQt6Core.so"
"${CMAKE_CURRENT_BINARY_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${QT_PREFIX_PATH}/lib/libQt6Widgets.so"
"${CMAKE_CURRENT_BINARY_DIR}"
)
Test app¶
#include <QApplication>
#include <QPushButton>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QPushButton button("Bonjour Rémi !");
button.setFixedSize(400, 100);
button.show();
return app.exec();
}

Autres petites choses utiles¶
Dans les paramètres :

On ajoute les outils :

Name : QT Creator
Program : C:\Qt\Tools\QtCreator\bin\qtcreator.exe
Arguments : $FilePath$
Working Directory : C:\Qt\Tools\QtCreator\bin
Name : QT Designer
Program : C:\Qt\Tools\QtDesignStudio\qt6_design_studio_reduced_version\bin\designer.exe
Arguments : $FilePath$
Working Directory : C:\Qt\Tools\QtDesignStudio\qt6_design_studio_reduced_version\bin
Name : QT Design Studio
Program : C:\Qt\Tools\QtDesignStudio\bin\qtdesignstudio.exe
Arguments : $FilePath$
Working Directory : C:\Qt\Tools\QtDesignStudio\bin

Installation Linux sur un serveur¶
Installation¶
wget https://download.qt.io/official_releases/qt/6.9/6.9.0/single/qt-everywhere-src-6.9.0.tar.xz
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build perl python3 pkg-config libssl-dev zlib1g-dev
tar -xf qt-everywhere-src-6.9.0.tar.xz
cd qt-everywhere-src-6.9.0
mkdir ../qt6-build && cd ../qt6-build
../qt-everywhere-src-6.9.0/configure \
-prefix /opt/qt6 \
-opensource -confirm-license -release \
-submodules qtbase \
-skip qtdeclarative,qt3d,qtquick3d,qtwayland,qtmultimedia,qtwebengine,qtpdf \
-no-feature-gui -no-feature-opengl \
-nomake examples -nomake tests
cmake --build . --parallel $(nproc)
sudo cmake --install .
- Pour activer Qt dans l'environnement
Dans # ~/.bashrc
export QTDIR=/opt/qt6
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
source ~/.bashrc
- Test
Test¶
cmake_minimum_required(VERSION 3.22)
project(TestQtConsole LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
list(APPEND CMAKE_PREFIX_PATH "/opt/qt6")
find_package(Qt6 REQUIRED COMPONENTS Core)
add_executable(test_qt_console main.cpp)
target_link_libraries(test_qt_console
Qt6::Core
)
#include <QCoreApplication>
#include <QDateTime>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
// Tâche différée : affichage puis fermeture propre
QTimer::singleShot(0, []{
qInfo() << "Qt Core est fonctionnel —"
<< QDateTime::currentDateTime().toString(Qt::ISODate);
QCoreApplication::quit();
});
return app.exec(); // Boucle d’événements minimale
}
Static build of Qt 6¶

- Soyez certain d’installer les sources dans l’installateur de Qt. Elles seront nécessaires pour la compilation.
- En principe CMake est installé sur votre ordinateur sinon rendez-vous sur le site web cmake.org

- Ninja doit aussi être installé, vous le trouverez dans les outils de l'installateur

Modifier l’environnement pour permettre la compilation (C++ ATL)¶

CALL "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64
SET _ROOT=F:\Frameworks\Qt\6.8.2\Src
SET _NINJA=F:\Frameworks\Qt\Tools\Ninja
SET PATH=%_ROOT%;%_NINJA%;%PATH%
Compilation static simple¶
configure -debug-and-release -opensource -static -platform win32-msvc -nomake examples -nomake tests -prefix F:\Coding\Frameworks\Qt\6.8.2\static
cmake --build . --parallel
ninja install
cmake_minimum_required(VERSION 3.25)
project(QT_HelloWorld)
# Tell CMake where Qt is located
set(QT_PREFIX_PATH "F:/Frameworks/Qt/6.8.2/static")
list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
# Tell CMake to find the Qt6Core and Qt6Widgets modules
find_package(Qt6 COMPONENTS Core Widgets REQUIRED)
# WIN32 is important to avoid the console windows
add_executable(QT_HelloWorld WIN32 main.cpp)
# Link the library to the executable
target_link_libraries(QT_HelloWorld Qt6::Core Qt6::Widgets)
Compilation static avec Link Time Optimization¶
configure -debug-and-release -opensource -static -ltcg -platform win32-msvc -nomake examples -nomake tests -prefix F:\Frameworks\Qt\6.8.2\staticLTO
cmake --build . --parallel
ninja install
cmake_minimum_required(VERSION 3.25)
project(QT_HelloWorld)
# Tell CMake where Qt is located
set(QT_PREFIX_PATH "F:/Frameworks/Qt/6.8.2/staticLTO")
list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
# Tell CMake to find the Qt6Core and Qt6Widgets modules
find_package(Qt6 COMPONENTS Core Widgets REQUIRED)
# WIN32 is important to avoid the console windows
add_executable(QT_HelloWorld WIN32 main.cpp)
set_property(TARGET QT_HelloWorld PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
# Link the library to the executable
target_link_libraries(QT_HelloWorld Qt6::Core Qt6::Widgets)