【问题标题】:QFileSystemModel and QTreeView showing dirs only. How to hide expansion marks against the empty dirs?QFileSystemModel 和 QTreeView 仅显示目录。如何隐藏空目录的扩展标记?
【发布时间】:2013-08-02 09:19:33
【问题描述】:

我正在构建有点像标准文件资源管理器 - 左侧窗格用于文件夹树,右侧窗格用于显示所选文件夹中的文件。

带有 QFileSystemModel 的 QTreeView 用于显示文件夹。模型的过滤器设置为QDir::Dirs | QDir::NoDotAndDotDot 仅列出目录,不列出文件。 我想仅针对具有子文件夹的文件夹显示扩展标记,即。 e.如果某些目录为空或仅包含文件,则它不应该是可扩展的。但相反,树视图会针对空目录保留扩展标记。这就是问题所在:如何隐藏它们

我在这里,在谷歌,在 QT 示例中搜索了解决方案 - 没有成功。虽然我认为这个问题很容易回答。 我目前唯一的解决方案是继承 QAbstractItemModel。那是痛苦。

QT 4.8、QT Creator、C++。

下面是演示代码:

#include <QApplication>

#include <QFileSystemModel>
#include <QTreeView>

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

    QTreeView w;

    QFileSystemModel m;
    m.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
    m.setRootPath("C:\\");

    w.setModel(&m);
    w.setRootIndex(m.index(m.rootPath()));
    w.hideColumn(3);
    w.hideColumn(2);
    w.hideColumn(1);

    w.show();

    return a.exec();
}

【问题讨论】:

    标签: qt qt4 qtreeview qfilesystemmodel


    【解决方案1】:

    最简单的方法:juste 像这样实现 hasChildren:

    /*!
     * Returns true if parent has any children and haven't the Qt::ItemNeverHasChildren flag set;
     * otherwise returns false.
     *
     *
     * \remarks Reimplemented to avoid empty directories to be collapsables
     *          and to implement the \c Qt::ItemNeverHasChildren flag.
     * \see     rowCount()
     * \see     child()
     *
     */
    bool YourModelName::hasChildren(const QModelIndex &parent) const
    {
        // return false if item cant have children
        if (parent.flags() &  Qt::ItemNeverHasChildren) {
            return false;
        }
        // return if at least one child exists
        return QDirIterator(
                    filePath(parent),
                    filter() | QDir::NoDotAndDotDot,
                    QDirIterator::NoIteratorFlags
                ).hasNext();
    }
    

    【讨论】:

      【解决方案2】:

      我已经使用

      解决了这个问题

      QFileSystemModel::fetchMore

      在当前级别的每个 QModelIndex 上。要知道某个文件夹是否已加载到模型中,可以使用信号

      void directoryLoaded (const QString & path)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 2021-08-26
        • 2020-01-16
        相关资源
        最近更新 更多