koldun90
|
|
« : Июль 31, 2014, 13:24 » |
|
Здравствуйте вы не могли бы пояснить что нужно сделать что бы модель отображала не всю файловую систему ,а отображала только несколько каталогов( мне нужно чтоб отображало корень"/",домашнюю директорию "/root"(директория пользователя root), а также еще каталог /mnt. Работаю в linuх. я так понимаю что нужно что то переопределить в qfilesystemmodel но вот что не знаю...
|
|
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #1 : Июль 31, 2014, 13:37 » |
|
1. void QFileSystemModel::setNameFilters(const QStringList & filters) 2. Можно пропустить ее через QSortFilterProxyModel.
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
koldun90
|
|
« Ответ #2 : Июль 31, 2014, 14:43 » |
|
1. void QFileSystemModel::setNameFilters(const QStringList & filters) 2. Можно пропустить ее через QSortFilterProxyModel.
const QStringList & filters я так понял этот список должен содержать папки которые я собираюсь отображать те в моем случае он должен включать /, /mnt, /root и что значит "Можно пропустить ее через QSortFilterProxyModel." поясните подробнее?
|
|
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #3 : Июль 31, 2014, 14:45 » |
|
QSortFilterProxyModel используется для того, чтобы отсортировать другую модель, либо применить к ней фильтр. Подробнее ты можешь прочитать в Ассистенте и посмотреть примеры.
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
koldun90
|
|
« Ответ #4 : Июль 31, 2014, 16:00 » |
|
ну допустим сделал я так QStringList filters; filters<<"/mnt"; filters<<"/root"; model1->setNameFilters(filters);
в итоге получилось что
|
|
« Последнее редактирование: Июль 31, 2014, 16:08 от koldun90 »
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #5 : Август 01, 2014, 07:26 » |
|
Да, не оно. Тогда через прокси модель.
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
koldun90
|
|
« Ответ #6 : Август 01, 2014, 09:22 » |
|
QSortFilterProxyModel используется для того, чтобы отсортировать другую модель, либо применить к ней фильтр ВЫ меня неправильно поняли наверно мне нужно чтобы как бы отображалось в моделе всего несколько каталогов допустим: +/ +/root +/home +/mnt и все собственно мне поможет это сделать QSortFilterProxyModel? и скажите какой метод смотреть в QSortFilterProxyModel?
|
|
« Последнее редактирование: Август 01, 2014, 09:35 от koldun90 »
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #7 : Август 01, 2014, 09:35 » |
|
и все собственно мне поможет это сделать QSortFilterProxyModel?
Да. Отнаследуйся от нее и реализуй C++ (Qt) bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const [virtual protected]
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
koldun90
|
|
« Ответ #8 : Август 04, 2014, 09:18 » |
|
начал я реализовывать сделал так mainwindow.cpp{ model1=new myqfilesystemmodel; //модель файловой системы ничего не переопределено
model2=new myqsortfilterproxymodel; //переопределен filteracceptrow
model1->setRootPath(QDir::rootPath()); //QDir::rootPath()--возвращает корень "/" model1->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot); //устанавливаю фильтер
model2->setSourceModel(model1); // засовываю myqfilesystemmodel в myqsortfilterproxymodel ui->treeView->setModel(model2); // в трививеве отображаю myqsortfilterproxymodel ui->treeView->hideColumn(2); // скрываю столбец один } myqsortfilterproxymodel.cppmyqsortfilterproxymodel::myqsortfilterproxymodel() { r=new myqfilesystemmodel; } bool myqsortfilterproxymodel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
QString str=r->fileInfo(source_parent).absoluteFilePath(); //беру индекс который попадает в метод if (str=="/" || str=="/root" || str=="/mnt/cdrom") // затем сравниваю его с заданными //индексами { return true; // и если индекс является одним из 3ех то я его добавляю в отображение } else { return false; // иначе не добавляю }
} p.s я так понял в документации написано так "Returns true if the item in the row indicated by the given source_row and source_parent should be included in the model; otherwise returns false."ТЕ возвратит true если source_parent должна включаться в отображение, если не должна то false..В итоге после запуска программы treeview вообще пустой ,те в модель не добавляется ничего хотя по идее там должно быть 3 каталога исходя из вышеприведенного кода "/"--корневой каталог "/root"--каталог пользователя root "/mnt/cdrom"--каталог cdrom
|
|
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #9 : Август 04, 2014, 09:35 » |
|
r=new myqfilesystemmodel; нахрена в конструкторе?
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
koldun90
|
|
« Ответ #10 : Август 04, 2014, 09:42 » |
|
мне нужно взять информацию о индексе source_parent для этого нужно использовать fileinfo это метод класса qfilesystemmodel как вы предлагаете сделать?
|
|
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #11 : Август 04, 2014, 09:43 » |
|
Допустим: qobject_cast<QFileSystemModel*> (sourceModel ())
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
koldun90
|
|
« Ответ #12 : Август 04, 2014, 09:57 » |
|
вы имеете ввиду qobject_cast<QFileSystemModel*> (sourceModel ())->fileinfo(source_parent); ??
|
|
|
Записан
|
|
|
|
koldun90
|
|
« Ответ #13 : Август 04, 2014, 10:11 » |
|
а что мне это даст я не понимаю у меня не отображаются каталоги в представлении модели...
|
|
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #14 : Август 04, 2014, 10:38 » |
|
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
|