Здравствуйте делаю файловый менеджер. Файловая система представлена в QFileSystemModel. Соответственно модель сортировки mysortfilterproxymodel унаследован от QSortFilterProxyModel. Файловую систему представляю в стандартном tableview.
вот класс
mysortfilterproxymodel mysortfilterproxymodel.hC++ (Qt)
#ifndef MYSORTFILTERPROXYMODEL_H
#define MYSORTFILTERPROXYMODEL_H
#include <QSortFilterProxyModel>
#include <QFileSystemModel>
#include <QMessageBox>
class MySortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
explicit MySortFilterProxyModel(QObject *parent = 0);
bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
signals:
public slots:
};
#endif // MYSORTFILTERPROXYMODEL_H
mysortfilterproxymodel.cppC++ (Qt)
#include "mysortfilterproxymodel.h"
MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent) :
QSortFilterProxyModel(parent)
{
}
bool MySortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
if (sortColumn() == 0)
{
QFileSystemModel *fsm = qobject_cast<QFileSystemModel*>(sourceModel());
bool asc = sortOrder() == Qt::AscendingOrder ? true : false;
QFileInfo leftFileInfo = fsm->fileInfo(left);
QFileInfo rightFileInfo = fsm->fileInfo(right);
if (sourceModel()->data(left).toString() == "..")
return asc;
if (sourceModel()->data(right).toString() == "..")
return !asc;
if (!leftFileInfo.isDir() && rightFileInfo.isDir()) {
return !asc;
}
if (leftFileInfo.isDir() && !rightFileInfo.isDir()) {
return asc;
}
}
return QSortFilterProxyModel::lessThan(left,right);
}
код главного модуля
mainwindow.cppC++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model1=new QFileSystemModel();
model1->setFilter(QDir::Files | QDir::AllDirs);
model1->setRootPath(QDir::homePath());
ui->tableView->setSortingEnabled(true);
sortmodel=new MySortFilterProxyModel();
sortmodel->setSourceModel(model1); // "засовываем" qfilesystemmodel-model1 в модель сортировки sortmodel-mysortfilterproxymodel
ui->tableView->setModel(sortmodel);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{
ui->tableView->setRootIndex(index);
sortmodel->sort(0,Qt::AscendingOrder);
model1->sort(0,Qt::AscendingOrder);
}
Проблема в следующем допустим ситуация:
1) Запускаю прогу
Затем отображается папка входа в корневой каталог "/"(вся файловая система)
2) При двойном клике соответственно отображается все содержимое все папки и файлы они все отсортированы
3) Допустим захожу в какую нибудь папку все сортируется все нормально
4) А При переходе обратно,на каталог выше(при нажатии на каталог с ..) программа рушится как бы
при чем это происходит если qsortfilterproxymodel обернута в myqsortfilterproxymodel...
а если не использовать прокси модель, то все происходит нормально.
Как эту проблему можно исправить....