- Qt 5.5
- Qt Quick Controls
- Qt Quick Controls - File System Browser Example
- main.cpp Example File
- Qt 5.5.1 Reference Documentation

# main.cpp Example File

filesystembrowser/main.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2015 The Qt Company Ltd.
    ** Contact: http://www.qt.io/licensing/
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** You may use this file under the terms of the BSD license as follows:
    **
    ** "Redistribution and use in source and binary forms, with or without
    ** modification, are permitted provided that the following conditions are
    ** met:
    **   * Redistributions of source code must retain the above copyright
    **     notice, this list of conditions and the following disclaimer.
    **   * Redistributions in binary form must reproduce the above copyright
    **     notice, this list of conditions and the following disclaimer in
    **     the documentation and/or other materials provided with the
    **     distribution.
    **   * Neither the name of The Qt Company Ltd nor the names of its
    **     contributors may be used to endorse or promote products derived
    **     from this software without specific prior written permission.
    **
    **
    ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include <QApplication>
    #include <QQmlApplicationEngine>
    #include <QtQml>
    #include <QFileSystemModel>
    #include <QDateTime>
    #include <QDesktopServices>
    #include <QUrl>

    static inline QString permissionString(const QFileInfo &fi)
    {
        const QFile::Permissions permissions = fi.permissions();
        QString result = QLatin1String("----------");
        if (fi.isSymLink())
            result[0] = QLatin1Char('l');
        else if (fi.isDir())
            result[0] = QLatin1Char('d');
        if (permissions & QFileDevice::ReadUser)
            result[1] = QLatin1Char('r');
        if (permissions & QFileDevice::WriteUser)
            result[2] = QLatin1Char('w');
        if (permissions & QFileDevice::ExeUser)
            result[3] = QLatin1Char('x');
        if (permissions & QFileDevice::ReadGroup)
            result[4] = QLatin1Char('r');
        if (permissions & QFileDevice::WriteGroup)
            result[5] = QLatin1Char('w');
        if (permissions & QFileDevice::ExeGroup)
            result[6] = QLatin1Char('x');
        if (permissions & QFileDevice::ReadOther)
            result[7] = QLatin1Char('r');
        if (permissions & QFileDevice::WriteOther)
            result[8] = QLatin1Char('w');
        if (permissions & QFileDevice::ExeOther)
            result[9] = QLatin1Char('x');
        return result;
    }

    static inline QString sizeString(const QFileInfo &fi)
    {
        if (!fi.isFile())
            return QString();
        const qint64 size = fi.size();
        if (size > 1024 * 1024 * 10)
            return QString::number(size / (1024 * 1024)) + QLatin1Char('M');
        if (size > 1024 * 10)
            return QString::number(size / 1024) + QLatin1Char('K');
        return QString::number(size);
    }

    class DisplayFileSystemModel : public QFileSystemModel {
    public:
        explicit DisplayFileSystemModel(QObject *parent = Q_NULLPTR)
            : QFileSystemModel(parent) {}

        enum  {
            SizeRole = Qt::UserRole + 4,
            DisplayableFilePermissionsRole = Qt::UserRole + 5,
            LastModifiedRole = Qt::UserRole + 6,
            UrlStringRole = Qt::UserRole + 7 // 263
        };

        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE
        {
            if (index.isValid() && role >= SizeRole) {
                switch (role) {
                case SizeRole:
                    return QVariant(sizeString(fileInfo(index)));
                case DisplayableFilePermissionsRole:
                    return QVariant(permissionString(fileInfo(index)));
                case LastModifiedRole:
                    return QVariant(fileInfo(index).lastModified().toString(Qt::SystemLocaleShortDate));
                case UrlStringRole:
                    return QVariant(QUrl::fromLocalFile(filePath(index)).toString());
                default:
                    break;
                }
            }
            return QFileSystemModel::data(index, role);
        }

        QHash<int,QByteArray> roleNames() const Q_DECL_OVERRIDE
        {
             QHash<int, QByteArray> result = QFileSystemModel::roleNames();
             result.insert(SizeRole, QByteArrayLiteral("size"));
             result.insert(DisplayableFilePermissionsRole, QByteArrayLiteral("displayableFilePermissions"));
             result.insert(LastModifiedRole, QByteArrayLiteral("lastModified"));
             return result;
        }
    };

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);

        QQmlApplicationEngine engine;
        QFileSystemModel *fsm = new DisplayFileSystemModel(&engine);
        fsm->setRootPath(QDir::homePath());
        fsm->setResolveSymlinks(true);
        engine.rootContext()->setContextProperty("fileSystemModel", fsm);
        engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

        return app.exec();
    }