Explorateur de système de fichiers
Une application QML de bureau utilisant une interface personnalisée ( Qt Quick Controls ) pour afficher des fichiers texte à partir d’un système de fichiers.

L'exemple « Explorateur de système de fichiers » utilise une mise en page moderne composée de trois éléments principaux : une barre latérale à base d’icônes à gauche, un « TreeView » redimensionnable affichant le système de fichiers à partir d’un répertoire QFileSystemModel, et la zone « TextArea » affichant les fichiers texte sélectionnés. Des commandes rapides personnalisées et des fenêtres sans bordure, dotées de décorations de fenêtre spécialisées, garantissent une apparence et une ergonomie cohérentes sur tous les systèmes d’exploitation. Lorsque vous lancez cette application depuis la ligne de commande, vous pouvez fournir un répertoire initial en tant que paramètre. Ce répertoire initial sera utilisé par le « TreeView » pour définir le point de départ de l’affichage de la structure des répertoires.
Exécution de l’exemple
Vous pouvez exécuter l’exemple à partir de :
- Qt Creator
Ouvrez le mode « Welcome » et sélectionnez l’exemple dans « Examples ». Pour plus d’informations, consultez Qt Creator: Tutoriel : Compiler et exécuter.
- Qt Extension for Visual Studio Code
Exécutez la commande « Qt: Open Qt examples » à partir de Command Palette, puis sélectionnez l’exemple dans la liste. Pour plus d’informations, consultez Qt Extension for Visual Studio Code: Tutoriel : Compiler et exécuter.
Mise en page et structure modernes
Pour commencer, l’exemple définit les couleurs à l’échelle d’un objet QML singleton. Cela permet d’assurer un contrôle structuré de l’apparence de l’application.
pragma Singleton
QtObject {
readonly property color background: "#292828"
readonly property color surface1: "#171819"
readonly property color surface2: "#090A0C"
readonly property color text: "#D4BE98"
readonly property color textFile: "#E1D2B7"
readonly property color disabledText: "#2C313A"
readonly property color selection: "#4B4A4A"
readonly property color active: "#292828"
readonly property color inactive: "#383737"
readonly property color folder: "#383737"
readonly property color icon: "#383737"
readonly property color iconIndicator: "#D5B35D"
readonly property color color1: "#A7B464"
readonly property color color2: "#D3869B"
}L’exemple utilise le drapeau « FramelessWindowHint » à l’intérieur de la balise « ApplicationWindow » pour créer une décoration personnalisée, plutôt que de s’appuyer sur la décoration de fenêtre du système d’exploitation. Afin d’obtenir une interaction équivalente avec la fenêtre, l’exemple redéfinit la propriété « contentItem » de l’ MenuBar personnalisé et affiche un texte d’information ainsi que des possibilités d’interaction permettant de faire glisser ou de fermer l’application. Les composants en ligne (Inline Components) simplifient ce processus.
component InteractionButton: Rectangle {
id: interactionButton
signal action()
property alias hovered: hoverHandler.hovered
Layout.fillHeight: true
Layout.preferredWidth: height
color: hovered ? Colors.background : "transparent"
HoverHandler {
id: hoverHandler
}
TapHandler {
id: tapHandler
onTapped: interactionButton.action()
}
}
InteractionButton {
id: minimize
onAction: root.dragWindow.showMinimized()
Rectangle {
anchors.centerIn: parent
color: parent.hovered ? Colors.iconIndicator : Colors.icon
height: 2
width: parent.height - 14
}
}
InteractionButton {
id: maximize
...La barre latérale de gauche comprend des boutons de navigation cochables en haut et des boutons à action unique en bas. Un « ButtonGroup » et un conteneur sont utilisés pour garantir qu’une seule entrée soit active à un moment donné. Il est alors possible de proposer différentes vues à l’aide d’un alias de propriété pour la position actuelle, ainsi qu’un « StackLayout ».
Cette technique vous permet d’étendre les fonctionnalités en ajoutant un autre bouton et l’élément correspondant à l’intérieur de l’ StackLayout.
StackLayout {
anchors.fill: parent
currentIndex: sidebar.currentTabIndex
// Shows the help text.
Text {
text: qsTr("This example shows how to use and visualize the file system.\n\n"
+ "Customized Qt Quick Components have been used to achieve this look.\n\n"
+ "You can edit the files but they won't be changed on the file system.\n\n"
+ "Click on the folder icon to the left to get started.")
wrapMode: TextArea.Wrap
color: Colors.text
}
// Shows the files on the file system.
FileSystemView {
id: fileSystemView
color: Colors.surface1
onFileClicked: path => root.currentFilePath = path
}
}L’ StackLayout comprend, outre un texte d’information, le FileSystemView. Ce composant personnalisé affiche les fichiers et les dossiers et le remplit avec des données provenant d’un modèle C++. Vous pouvez ensuite sélectionner les fichiers et les lire en conséquence.
QString FileSystemModel::readFile(const QString &filePath)
{
// Don't issue errors for an empty path, as the initial binding
// will result in an empty path, and that's OK.
if (filePath.isEmpty())
return {};
QFile file(filePath);
if (file.size() >= 2'000'000)
return tr("File size is too big.\nYou can read files up to %1 MB.").arg(2);
static const QMimeDatabase db;
const QMimeType mime = db.mimeTypeForFile(QFileInfo(file));
// Check if the mimetype is supported and return the content.
const auto mimeTypesForFile = mime.parentMimeTypes();
for (const auto &m : mimeTypesForFile) {
if (m.contains("text", Qt::CaseInsensitive)
|| mime.comment().contains("text", Qt::CaseInsensitive)) {
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return tr("Error opening the File!");
QTextStream stream(&file);
return stream.readAll();
}
}
return tr("Filetype not supported!");
}Un clic droit sur un dossier dans l’ TreeView ouvre une fenêtre contextuelle Menu, qui permet de contrôler la propriété rootIndex de l’ TreeView.
MyMenu {
id: contextMenu
Action {
text: qsTr("Set as root index")
onTriggered: {
fileSystemTreeView.rootIndex = fileSystemTreeView.index(treeDelegate.row, 0)
}
}
Action {
text: qsTr("Reset root index")
onTriggered: fileSystemTreeView.rootIndex = undefined
}
}
}SplitView vous permet de répartir dynamiquement l’espace entre l’ StackLayout et l’éditeur. L’éditeur contient l’ TextArea qui affiche le fichier ouvert et offre toutes les fonctionnalités nécessaires à l’édition de fichiers texte. De plus, l’éditeur affiche les numéros de ligne, que vous pouvez activer ou désactiver dans l’ Menu.
Editor {
id: editor
showLineNumbers: root.showLineNumbers
currentFilePath: root.currentFilePath
SplitView.fillWidth: true
SplitView.fillHeight: true
}Composants personnalisés
Pour mieux comprendre le processus de personnalisation, consultez d’abord l’article « Personnalisation d’un contrôle ». Cet exemple utilise des composants réutilisables et personnalisés.
Par exemple, le composant MyMenu personnalise la propriété background du Menu, la propriété contentItem de son délégué, ainsi que les propriétés background.
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Controls.Basic
import FileSystemModule
Menu {
id: root
delegate: MenuItem {
id: menuItem
contentItem: Item {
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 5
text: menuItem.text
color: enabled ? Colors.text : Colors.disabledText
}
Rectangle {
id: indicator
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
width: 6
height: parent.height
visible: menuItem.highlighted
color: Colors.color2
}
}
background: Rectangle {
implicitWidth: 210
implicitHeight: 35
color: menuItem.highlighted ? Colors.active : "transparent"
}
}
background: Rectangle {
implicitWidth: 210
implicitHeight: 35
color: Colors.surface2
}
}Un autre exemple est la personnalisation de l’ ScrollIndicator à l’intérieur de l’ FileSystemView, qui utilise des animations personnalisées. Ici, l’exemple redéfinit la propriété contentItem.
ScrollIndicator.vertical: ScrollIndicator {
active: true
implicitWidth: 15
contentItem: Rectangle {
implicitWidth: 6
implicitHeight: 6
color: Colors.color1
opacity: fileSystemTreeView.movingVertically ? 0.5 : 0.0
Behavior on opacity {
OpacityAnimator {
duration: 500
}
}
}
}Version Python
Si la version Python de cet exemple vous intéresse, vous la trouverez ici. Elle présente l’utilisation de ` Qt for Python ` et montre comment s’en servir pour créer la même application.
De plus, un tutoriel détaillé est disponible ; il fournit des instructions étape par étape sur la manière d’étendre cet exemple avec des fonctionnalités supplémentaires. Ce tutoriel peut s’avérer utile si vous souhaitez explorer et en savoir plus sur la manière de tirer parti des fonctionnalités existantes de l’explorateur de système de fichiers.
Fichiers source
Voir également Tous les exemples Qt et les exemplesQt Quick Controls .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.