Russian Qt Forum
Ноябрь 24, 2024, 07:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: сортировка файловой системы QFileSystemModel представленной в виде таблицы  (Прочитано 4806 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Январь 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...
а если не использовать прокси модель, то все происходит нормально.
Как эту проблему можно исправить....
« Последнее редактирование: Январь 29, 2015, 15:14 от koldun90 » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 29, 2015, 15:14 »

В lessThan нужно мапить индексы для обращения к сорс модели - mapToSource.

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #2 : Январь 29, 2015, 15:20 »

В lessThan нужно мапить индексы для обращения к сорс модели - mapToSource.

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

 Я вас правильно понял нужно применить метод maptosource к индексам ?
Код:
const QModelIndex &left, const QModelIndex &right
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Январь 29, 2015, 15:25 »

Да, перед обращением к сорц модели.
Ошибся, давно с проксями не работал.
Глянь когда-то писал проксю - она работала https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactorsortfilterproxymodel.cpp
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Январь 29, 2015, 15:28 »

Раз пишешь ФМ, глянь, может что пригодится https://github.com/panter-dsd/PantherCommander пилил когда-то.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #5 : Январь 29, 2015, 16:41 »

я так и не понял что толком  можно сделать...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Январь 29, 2015, 16:50 »

Приложи сюда минимальный компилябельный пример, который воспроизводит багу.
А вообще, gdb в руки и смотреть где падает.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #7 : Январь 29, 2015, 20:06 »

хорошу приведу пример...
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #8 : Январь 30, 2015, 09:51 »

вот пример проекта
http://zalil-slil.rusfolder.net/files/42862538
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Январь 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);
}
 
Всегда пожалуйста.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.271 секунд. Запросов: 22.