QT6 đș#
Prudence
La premiĂšre version de ce tutorial a Ă©tĂ© fait pour QT 6.5.2, je lâai mis Ă jour pour 6.6.0 mais 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 Dynamic
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 utilisant la version opensource 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#
CMakeList#
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.6.0/msvc2019_64")
list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
# Tell cmake to find the modules Qt5Core and Qt6widgets
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();
}
En principe tout fonctionne et vous devriez voir une fenĂȘtre sâouvrir :
[!NOTE] Unicode Comme vous le remarquez, QT gĂšre lâunicode convenablement, cependant je vous invite sous windows Ă ajouter le BOM. (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#
Sâinscrire en tant quâutilisateur souhaitant utilisant la version opensource 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 update libgl1-mesa-dev libxcb-cursor0
Installer le logiciel (dans mon cas
/home/remi/Frameworks/Qt
)
Utilisation#
CMakeList#
cmake_minimum_required(VERSION 3.25)
project(QT_HelloWorld)
set(CMAKE_CXX_STANDARD 23)
# Tell cmake where Qt is located
list(APPEND CMAKE_PREFIX_PATH "/home/remi/Frameworks/Qt/6.6.0/gcc_64/")
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
"${CMAKE_PREFIX_PATH}/lib/libQt6Core.so"
"${CMAKE_CURRENT_BINARY_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${CMAKE_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
Static build of QT 6#
Soyez certain dâinstaller les sources dans lâinstallateur de QT. Elles seront nĂ©cessaire 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.7.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:\Frameworks\Qt\6.7.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.7.0/static")
list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
# Tell cmake to find the modules Qt5Core and Qt6widgets
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.7.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.7.0/staticLTO")
list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
# Tell cmake to find the modules Qt5Core and Qt6widgets
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)