QT6 đŸ˜ș#

../../_images/qtlogo.png

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#

../../_images/maintainqt.png ../../_images/installqt.png
  • 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 :

../../_images/hwqt.png

[!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)

../../_images/utf1.png ../../_images/utf2.png

Installation sur Linux#

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
../../_images/maintainqt.png ../../_images/installqt.png
  • 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();
}
../../_images/hwqtl.png

Autres petites choses utiles#

Dans les paramĂštres :

../../_images/param.png

On ajoute les outils :

../../_images/tool.png

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

../../_images/menu.png

Static build of QT 6#

../../_images/sources.png
  • 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

../../_images/cmake.png
  • Ninja doit aussi ĂȘtre installĂ©, vous le trouverez dans les outils de l’installateur

../../_images/otherinstall.png

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

../../_images/atl.png
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)

Sources et remerciements#