Auf dieser Seite

Dateisystem-Explorer

Eine Desktop-QML-Anwendung, die angepasste Qt Quick Controls verwendet, um Textdateien aus einem Dateisystem anzuzeigen.

Ein Dateisystem-Explorer UI

Das Beispiel des Dateisystem-Explorers verwendet ein modernes Layout, das aus drei Hauptkomponenten besteht: eine auf Symbolen basierende Seitenleiste auf der linken Seite, eine in der Größe veränderbare TreeView, die das Dateisystem von QFileSystemModel anzeigt, und die TextArea, die die ausgewählten Textdateien anzeigt. Angepasste Quick Controls und rahmenlose Fenster mit speziellen Fensterdekorationen sorgen für ein einheitliches Erscheinungsbild auf allen Betriebssystemen. Wenn Sie diese Anwendung über die Befehlszeile starten, können Sie ein Anfangsverzeichnis als Parameter angeben. Dieses Anfangsverzeichnis wird von TreeView verwendet, um den Startpunkt für die Anzeige der Verzeichnisstruktur festzulegen.

Ausführen des Beispiels

Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Für weitere Informationen siehe Qt Creator: Tutorial: Erstellen und Ausführen.

Modernes Layout und Struktur

Zu Beginn stellt das Beispiel die Farben in einem einzigen QML-Objekt bereit. Dies soll eine strukturierte Kontrolle über das Erscheinungsbild der Anwendung gewährleisten.

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"
}

Das Beispiel verwendet das FramelessWindowHint Flag innerhalb von ApplicationWindow, um eine angepasste Dekoration zu erstellen, anstatt sich auf die Fensterdekoration des Betriebssystems zu verlassen. Um eine gleichwertige Interaktion mit dem Fenster zu erreichen, überschreibt das Beispiel die Eigenschaft contentItem der angepassten MenuBar und zeigt Informationstext und Interaktionsmöglichkeiten zum Ziehen oder Schließen der Anwendung an. Inline-Komponenten vereinfachen diesen Prozess.

            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
    ...

Die Sidebar auf der linken Seite enthält ankreuzbare Navigationsschaltflächen oben und One-Shot-Schaltflächen unten. Um sicherzustellen, dass immer nur ein Eintrag aktiv ist, werden ButtonGroup und ein Container verwendet. Mit einem Eigenschaftsalias für die aktuelle Position und einem StackLayout können dann verschiedene Ansichten bereitgestellt werden.

Mit dieser Technik können Sie die Funktionalität erweitern, indem Sie eine weitere Schaltfläche und das entsprechende Element innerhalb des StackLayout hinzufügen.

                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
                    }
                }

Die StackLayout enthält neben einem Informationstext auch die FileSystemView. Diese benutzerdefinierte Komponente zeigt Dateien und Ordner an und füllt sie mit Daten aus einem C++-Modell auf. Sie können dann die Dateien auswählen und sie entsprechend lesen.

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!");
}

Wenn Sie mit der rechten Maustaste auf einen Ordner im TreeView klicken, öffnet sich ein Popup Menu, das die Kontrolle über die Eigenschaft rootIndex des TreeView ermöglicht.

            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 Damit können Sie den Raum zwischen StackLayout und dem Editor dynamisch teilen. Der Editor enthält den TextArea, der die geöffnete Datei anzeigt und alle Funktionen bietet, die zum Bearbeiten von Textdateien erforderlich sind. Zusätzlich bietet der Editor Zeilennummern, die in der Menu ein- und ausgeschaltet werden können.

            Editor {
                id: editor
                showLineNumbers: root.showLineNumbers
                currentFilePath: root.currentFilePath
                SplitView.fillWidth: true
                SplitView.fillHeight: true
            }

Benutzerdefinierte Komponenten

Um den Anpassungsprozess besser zu verstehen, sollten Sie sich zunächst den Artikel Anpassen eines Controls ansehen. In diesem Beispiel werden wiederverwendbare und angepasste Komponenten verwendet.

Zum Beispiel passt die Komponente MyMenu die Eigenschaft background von Menu, die contentItem seines Delegaten und die background Eigenschaften an.

// 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
    }
}

Ein weiteres Beispiel ist die Anpassung der ScrollIndicator innerhalb der FileSystemView, die angepasste Animationen verwendet. Hier überschreibt das Beispiel die 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
                    }
                }
            }
        }

Python-Version

Wenn Sie an der Python-Version dieses Beispiels interessiert sind, finden Sie sie hier. Sie zeigt die Verwendung von Qt for Python und demonstriert, wie man damit die gleiche Anwendung erstellen kann.

Außerdem ist ein ausführliches Tutorial verfügbar, das Schritt für Schritt erklärt, wie man dieses Beispiel um zusätzliche Funktionen erweitern kann. Dieses Tutorial kann hilfreich sein, wenn Sie mehr über die bestehenden Funktionen des Dateisystem-Explorers erfahren möchten.

Quelldateien

Beispielprojekt @ code.qt.io

Siehe auch Alle Qt Beispiele und Qt Quick Controls Beispiele.

© 2025 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.