我只想显示使用QT5.10窗口中按驱动器号排序的挂载驱动器。这是我的测试代码:
#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模型设置为
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:)”
所以我把这行
fsFilter->setFilterRole(QFileSystemModel::FilePathRole);但这没什么用。
解决方案(在上面的代码列表中更正):
fsFilter->setSortRole(QFileSystemModel::FilePathRole);发布于 2018-03-22 08:00:59
您应该在lessThan中重新实现虚拟函数FSFilter,默认情况下它按字母顺序排序,但在这种情况下,您需要考虑驱动器名中的首字母和最后字母。
https://stackoverflow.com/questions/49418461
复制相似问题