Pour préparer les questions d'entretien d'un développeur C++ Qt, partez de la technologie d'interface du produit. Qt Widgets sert aux applications de bureau classiques, avec beaucoup de formulaires, de tableaux et d'arbres. QML et Qt Quick servent aux interfaces animées et tactiles, souvent sur une carte Linux embarquée reliée à un écran. Les offres citent C++, Qt, CMake et Linux, parfois une cible ARM, et précisent rarement la version de Qt. Demandez-la, car Qt 5 et Qt 6 ne s'écrivent pas tout à fait de la même façon.
Le piège vient des profils qui ont posé des widgets dans Qt Designer sans comprendre la mécanique. La différence se voit sur quelques sujets : un QObject qui appartient au mauvais thread, un widget modifié depuis un thread de calcul, un modèle qui oublie beginInsertRows, une liaison QML écrasée par une affectation en JavaScript. Un candidat solide parle aussi de C++ moderne et de la propriété des objets dans l'arbre parent-enfant.
Beaucoup d'applications tournent encore en Qt 5.15, dont le support standard s'est arrêté en mai 2025. Si le poste prévoit le passage à Qt 6, faites raconter une migration réelle. Le PDF joint détaille 30 questions sur six axes, un cas de 20 minutes et une grille de 1 à 4.
Les modules Qt et les outils du poste
Qt Core, QObject et boucle d'événements
Le socle de Qt. Les QObject s'organisent en arbre parent-enfant, et un parent détruit ses enfants. La boucle d'événements distribue les clics, les timers et les messages entre objets. Un code qui la bloque fige l'interface, et les utilisateurs le voient tout de suite.
Signaux et slots
Le mécanisme de communication entre objets. Un signal émis appelle les slots connectés, soit directement, soit par la file d'événements du thread destinataire quand les objets vivent dans des threads différents. La syntaxe par pointeur de fonction, apparue avec Qt 5, a remplacé les macros SIGNAL et SLOT, qu'on croise encore dans le code ancien.
Qt Widgets
Les composants d'interface de bureau : fenêtres, formulaires, QTableView, QTreeView. On les construit en code ou avec Qt Designer (fichiers .ui). Les widgets ne s'utilisent que depuis le thread principal. Beaucoup d'applications de bureau maintenues depuis des années en sont faites.
QML et Qt Quick
Un langage déclaratif pour décrire l'interface, avec des liaisons de propriétés qui se recalculent seules et du JavaScript pour la logique légère. La logique métier reste en C++, exposée par des propriétés (Q_PROPERTY), des modèles et des types enregistrés avec QML_ELEMENT. C'est le choix habituel pour les écrans tactiles et animés.
Modèle/vue
Les données vivent dans un modèle (QAbstractItemModel et ses dérivés), l'affichage dans une vue, en Widgets comme en QML. Un modèle bien écrit prévient la vue de chaque insertion, suppression ou modification. C'est ce qui permet d'afficher de grandes tables sans ralentir l'interface.
QThread et Qt Concurrent
QThread, l'objet travailleur déplacé avec moveToThread, QThreadPool et Qt Concurrent pour les calculs ponctuels. Chaque QObject appartient à un thread, ce qui décide de l'endroit où ses slots s'exécutent. Les plantages les plus difficiles à trouver dans une application Qt viennent souvent de là.
CMake, Qt Creator et compilation croisée
Qt 6 utilise CMake comme système de build principal ; qmake reste courant dans les projets Qt 5. Qt Creator est l'éditeur le plus répandu. Pour une cible embarquée, l'application est compilée avec une chaîne croisée, souvent un SDK produit par Yocto, et s'affiche en plein écran via eglfs ou un compositeur Wayland.
Qt Test et outils de diagnostic
Qt Test fournit les tests unitaires, la simulation de clics et de frappes, et QSignalSpy pour vérifier les signaux émis. QAbstractItemModelTester contrôle qu'un modèle respecte les règles. Pour le QML, qmllint et le profileur de Qt Creator. Squish, outil commercial, sert aux tests d'interface de bout en bout.
Le développeur C++ Qt travaille souvent sur une application maintenue pendant des années, avec du code écrit à plusieurs époques de Qt. Sur poste de bureau, il manipule surtout Qt Widgets, le modèle/vue et la communication avec des services ou du matériel. Sur cible embarquée, il ajoute QML, la compilation croisée, les contraintes de mémoire et de temps de démarrage, parfois Qt for MCUs pour les microcontrôleurs. La licence compte aussi : Qt est proposé en LGPLv3, en GPL ou sous licence commerciale, et ce choix change ce qu'on peut livrer dans un produit fermé. Attendez ce point d'un senior.
Six sujets Qt et C++ à noter un par un
- C++ moderne et propriété des QObject
- Boucle d'événements, signaux et slots
- Threads et concurrence avec Qt
- Modèle/vue et performance d'affichage
- QML, Qt Quick et intégration C++
- Build, migration Qt 6 et cible embarquée
Les questions Qt qui révèlent un vrai vécu d'IHM
Chaque question vient avec ce qu'une bonne réponse contient et le signal qui doit vous alerter. Pas besoin d'être technique pour les poser : écoutez si le candidat raconte du vécu.
Question 1 · confirmé
Un calcul de trois secondes, lancé au clic sur un bouton, fige l'interface. Comment le sortez-vous du thread principal, et comment le résultat revient-il à l'écran ?
Une bonne réponseUn objet travailleur déplacé dans un QThread avec moveToThread, ou QtConcurrent::run avec un QFutureWatcher pour un calcul ponctuel. Le résultat revient par un signal : entre deux threads, la connexion passe automatiquement en file d'attente et le slot s'exécute dans le thread principal, le seul autorisé à toucher aux widgets. Le candidat prévoit l'annulation et l'arrêt propre du thread à la fermeture (quit puis wait).
Signal d'alerteAppeler QCoreApplication::processEvents() dans la boucle de calcul, ou modifier un QLabel directement depuis le thread de travail.
Question 2 · junior à confirmé
Quelle différence faites-vous entre une connexion directe et une connexion en file d'attente, et laquelle Qt choisit-il par défaut ?
Une bonne réponseDirecte : le slot est appelé tout de suite, dans le thread qui émet, comme un appel de fonction. En file : un événement est posté et le slot s'exécute plus tard dans le thread de l'objet récepteur, ce qui suppose des arguments copiables et connus du système de types de Qt. Par défaut, AutoConnection décide au moment de l'émission : directe si l'émetteur tourne dans le thread du récepteur, en file sinon. Le candidat connaît le risque d'interblocage de BlockingQueuedConnection entre deux objets du même thread.
Signal d'alerte« Les signaux sont toujours asynchrones », ou aucune idée du thread dans lequel le slot s'exécute.
Question 3 · senior
Vous ajoutez 10 000 lignes par seconde à une table affichée dans un QTableView. L'interface rame. Que regardez-vous ?
Une bonne réponseUn modèle écrit à la main (QAbstractTableModel) plutôt qu'un QStandardItemModel, avec des insertions groupées par lots, un beginInsertRows/endInsertRows par paquet déclenché par un timer, au lieu d'une insertion par ligne. Une fonction data() rapide, sans calcul lourd ni allocation à chaque appel. Des en-têtes à taille fixe plutôt qu'un ajustement des colonnes au contenu, qui parcourt les données. Le candidat propose aussi de limiter l'historique affiché.
Signal d'alertebeginResetModel à chaque nouvelle ligne, ou un QTableWidget rempli cellule par cellule.
Question 4 · junior à confirmé
Qui détruit un QObject créé avec new et un parent ? Et sans parent ?
Une bonne réponseAvec un parent, c'est le parent qui le détruit au moment de sa propre destruction : l'arbre d'objets gère la mémoire. Sans parent, c'est au code de le faire, avec un pointeur intelligent ou deleteLater. Le candidat sait qu'il faut passer par deleteLater pour un objet qui peut encore recevoir des événements, et qu'un objet qui a un parent ne doit pas être aussi détenu par un std::unique_ptr, sous peine de double destruction.
Signal d'alerteDes delete à la main partout, ou « Qt a un ramasse-miettes ».
Question 5 · confirmé
En QML, une propriété liée à une autre cesse de se mettre à jour après un clic. Que s'est-il passé ?
Une bonne réponseUne affectation en JavaScript, dans un onClicked par exemple, a remplacé la liaison par une valeur fixe. Le candidat recrée la liaison avec Qt.binding(), ou mieux, modifie la valeur source dont dépend la liaison, ou passe par des states. Il cite la catégorie de log qt.qml.binding.removal pour repérer ces suppressions.
Signal d'alerteAjouter un timer qui recopie la valeur, ou ne pas faire la différence entre une liaison et une affectation.
Recevez la fiche d'entretien complète en PDF
La fiche pour mener l'entretien de bout en bout, prête à imprimer ou à partager avec le manager.
- 30 questions sur 6 axes, avec la bonne réponse, le signal d'alerte et la relance
- Le niveau visé pour chaque question
- Une mise en situation de 20 minutes et ce qu'on attend du candidat
- La grille d'évaluation de 1 à 4, axe par axe
Qt Widgets, QML, Qt 6 : les réponses aux recruteurs
Quelles compétences attendre d'un développeur C++ Qt ?
Un C++ moderne solide (RAII, sémantique de déplacement, pointeurs intelligents) et une bonne compréhension de QObject : arbre parent-enfant, signaux et slots, boucle d'événements, appartenance aux threads. Ajoutez le modèle/vue, Qt Widgets ou QML selon le produit, CMake et Qt Test. Sur cible embarquée, la compilation croisée, Yocto et l'affichage sans bureau (eglfs, Wayland) comptent autant que Qt lui-même.
Qt Widgets ou QML : faut-il exiger les deux ?
Exigez celle que votre produit utilise et vérifiez l'autre en surface. Un développeur Widgets passe à QML en quelques semaines s'il maîtrise déjà les modèles et l'exposition d'objets C++. Le chemin inverse demande d'apprendre les layouts, les délégués et la richesse des widgets de bureau. Dans les deux cas, la logique métier en C++ et les threads restent ce qui pèse le plus dans l'évaluation.
Comment vérifier l'expérience d'une migration de Qt 5 vers Qt 6 ?
Demandez par quoi la migration a commencé et ce qui a cassé. Un récit crédible passe par une version 5.15 nettoyée des API dépréciées, le passage de qmake à CMake, le module Core5Compat pour QRegExp ou QTextCodec, et des tests d'affichage sur chaque cible. Un candidat qui ne cite que le changement des numéros de version a sans doute seulement fait compiler le projet.
Quel test technique pour un développeur C++ Qt ?
Un petit projet existant avec un bug de thread, un widget modifié depuis un thread de travail, et un modèle qui oublie de prévenir sa vue suffit pour une heure. Observez comment la personne lit le code, reproduit le bug et le corrige avec des connexions en file. Pour un poste QML, ajoutez une liaison cassée par une affectation. Faites commenter à voix haute plutôt que de donner un long projet à rendre.
Pour structurer vos autres entretiens, consultez aussi nos pages sur les questions d'entretien de recrutement, la méthode de l'entretien structuré et la grille d'évaluation d'entretien.



