Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Январь 29, 2015, 15:10



Название: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: koldun90 от Январь 29, 2015, 15:10
Здравствуйте делаю файловый менеджер. Файловая система представлена в QFileSystemModel. Соответственно модель сортировки mysortfilterproxymodel  унаследован от QSortFilterProxyModel. Файловую систему представляю в стандартном tableview.
вот класс mysortfilterproxymodel  

mysortfilterproxymodel.h
Код
C++ (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.cpp
Код
C++ (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.cpp

Код
C++ (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...
а если не использовать прокси модель, то все происходит нормально.
Как эту проблему можно исправить....


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: Пантер от Январь 29, 2015, 15:14
В lessThan нужно мапить индексы для обращения к сорс модели - mapToSource.

Пользуйся тегом code для форматирования сообщений.


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: koldun90 от Январь 29, 2015, 15:20
В lessThan нужно мапить индексы для обращения к сорс модели - mapToSource.

Пользуйся тегом code для форматирования сообщений.

 Я вас правильно понял нужно применить метод maptosource к индексам ?
Код:
const QModelIndex &left, const QModelIndex &right


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: Пантер от Январь 29, 2015, 15:25
Да, перед обращением к сорц модели.
Ошибся, давно с проксями не работал.
Глянь когда-то писал проксю - она работала https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactorsortfilterproxymodel.cpp


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: Пантер от Январь 29, 2015, 15:28
Раз пишешь ФМ, глянь, может что пригодится https://github.com/panter-dsd/PantherCommander пилил когда-то.


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: koldun90 от Январь 29, 2015, 16:41
я так и не понял что толком  можно сделать...


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: Пантер от Январь 29, 2015, 16:50
Приложи сюда минимальный компилябельный пример, который воспроизводит багу.
А вообще, gdb в руки и смотреть где падает.


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: koldun90 от Январь 29, 2015, 20:06
хорошу приведу пример...


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: koldun90 от Январь 30, 2015, 09:51
вот пример проекта
http://zalil-slil.rusfolder.net/files/42862538


Название: Re: сортировка файловой системы QFileSystemModel представленной в виде таблицы
Отправлено: Пантер от Январь 30, 2015, 10:16
Код
C++ (Qt)
void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{  
const QFileInfo fileInfo = model1->fileInfo (sortmodel->mapToSource (index)).absoluteFilePath ();
const QModelIndex entryIndex = model1->index (fileInfo.absoluteFilePath ());
ui->tableView->setRootIndex (sortmodel->mapFromSource (entryIndex));
   sortmodel->sort(0,Qt::AscendingOrder);
}
 
Всегда пожалуйста.