首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QFileSystemModel和代理在QTreeView中的排序不同

QFileSystemModel和代理在QTreeView中的排序不同
EN

Stack Overflow用户
提问于 2018-03-22 00:03:15
回答 1查看 762关注 0票数 0

我只想显示使用QT5.10窗口中按驱动器号排序的挂载驱动器。这是我的测试代码:

代码语言:javascript
复制
#include <QtWidgets>
#include <QDebug>

QStringList mountedDrives;

class FSFilter : public QSortFilterProxyModel
{
public:
    FSFilter(QObject *parent)  : QSortFilterProxyModel(parent) {}
protected:
    bool filterAcceptsRow(int row, const QModelIndex &par) const override
    {
        QModelIndex idx = sourceModel()->index(row, 0, par);
        QString path = idx.data(QFileSystemModel::FilePathRole).toString();
        QString path2 = idx.data(Qt::DisplayRole).toString();
        bool mounted = mountedDrives.contains(path);
        if (mounted) {
            qDebug() << "QFileSystemModel::FilePathRole =" << path
                     << "  Qt::DisplayRole =" << path2;
            return true;
        }
        else return false;
    }
};

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

    // get mounted drives only
    foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {
        if (storage.isValid() && storage.isReady()) {
            if (!storage.isReadOnly()) {
                mountedDrives << storage.rootPath();
            }
        }
    }

    QFileSystemModel *fsModel = new QFileSystemModel;
    fsModel->setRootPath("");

    FSFilter *fsFilter = new FSFilter(fsModel);
    fsFilter->setSourceModel(fsModel);
    fsFilter->setSortRole(QFileSystemModel::FilePathRole); // now it works
    fsModel->fetchMore(fsModel->index(0,0));

    QTreeView tree;
    tree.setModel(fsFilter);  // different sort if use  
    tree.setModel(fsFilter);
    tree.setSortingEnabled(true);
    tree.sortByColumn(0, Qt::AscendingOrder);

    tree.resize(800, 400);
    tree.setColumnWidth(0, 300);
    tree.setWindowTitle(QObject::tr("File System Test"));
    tree.show();

    return app.exec();
}

这很好,产生了这个输出,除非它没有按驱动器号排序:

运行相同的代码,但将treeview模型设置为

代码语言:javascript
复制
tree.setModel(fsModel);  // use QFileSystemModel, not QSortFilterProxyModel

结果如下,其中的项目按我想要的方式排序:

我想这可能是个角色问题。下面是我的qDebug语句的输出:

QFileSystemModel::FilePathRole = "C:/“Qt::DisplayRole = "C:” QFileSystemModel::FilePathRole = "D:/“Qt::DisplayRole = "Data (D:)” QFileSystemModel::FilePathRole = "E:/“Qt::DisplayRole = "Photos (E:)” QFileSystemModel::FilePathRole = "F:/“Qt::DisplayRole = "Archive (F:)” QFileSystemModel::FilePathRole = "H:/“Qt::DisplayRole = "Old D (H:)” QFileSystemModel::FilePathRole = "I:/“Qt::DisplayRole = "Old C (I:)”

所以我把这行

代码语言:javascript
复制
fsFilter->setFilterRole(QFileSystemModel::FilePathRole);

但这没什么用。

解决方案(在上面的代码列表中更正):

代码语言:javascript
复制
fsFilter->setSortRole(QFileSystemModel::FilePathRole);
EN

回答 1

Stack Overflow用户

发布于 2018-03-22 08:00:59

您应该在lessThan中重新实现虚拟函数FSFilter,默认情况下它按字母顺序排序,但在这种情况下,您需要考虑驱动器名中的首字母和最后字母。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49418461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档