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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDirModel + insertRow. Помогите, не могу вставить строку.  (Прочитано 5172 раз)
tem1k
Гость
« : Ноябрь 10, 2009, 14:04 »

Есть QTableVeiw в котором показаны файлы через QDirModel. Хочу вставить строку с именем ".." для перехода в предыдущий каталог и так каждый раз при открытии нового каталога. Знаю о существовании функции
Код:
insertRow ( int row, const QModelIndex & parent = QModelIndex() )
но не могу научиться ей пользоваться. Если кому не трудно, объясните пожалуйста что такое
Код:
QModelIndex & parent = QModelIndex()
и как его получать, точнее я понимаю что это паретнт, но какой именно. И если не трудно напишите кусочек кода для вставки такой строки, в качестве примера. А то перекопал весь ассистант и гугл, а понять все равно не могу...

Заранее благодарен.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #1 : Ноябрь 10, 2009, 14:09 »

QModelIndex index ( const QString & path, int column = 0 ) const
индекс - позиция в ячейке. Индексы в 1м столбце можно ассоциировать с файлами и папками:
допустим folder - папка, ей соответствует индекс index
тогда для folder/folder2: index2 это индекс с координатами (0, 0, index);
для  folder/file1: index3 это индекс  с координатами (1, 0, index);
для folder/folder2/folder3 index3 это индекс  с координатами (0, 0, index2);
т.е. парент в твоем случае - это индекс, ассоциированный с папкой в которую хочешь вставить ".."
Записан
tem1k
Гость
« Ответ #2 : Ноябрь 10, 2009, 14:48 »

Спасибо за объяснение. Теперь примерно я понимаю. Следовательно для вставки, допустим по даблклику я должен писать так:
Код:
void F_MainWindow::on_TreeView_doubleClicked(QModelIndex index)
{
     ...

     ui.treeView->model()->insertRow(0,index);
}

я правильно понял ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #3 : Ноябрь 10, 2009, 14:54 »

это вставит 1 ряд _внутрь_ индекса, по которому кликнул. Т.е. в случае папки создаст подпапку, в случае файла сделает ряд внутри файла (что немного сносит мозг:))
Я кстати не уверен, что можно так с дир моделью извращаться) Если получится, напиши обязательно, мне тоже надо бы ".." в моей модели реализовать, но не переписывая структуру дерева
Записан
tem1k
Гость
« Ответ #4 : Ноябрь 10, 2009, 15:03 »

Понятно. Но дело в том что 
Код:
qDebug() << ui.treeView->model()->insertRow(0,index);
возвращает false. То есть, если я понял правильно, вставить строку в QDirModel простыми средствами вставить не получится ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #5 : Ноябрь 10, 2009, 15:08 »

ну как минимум у QDirModel этот метод не переопределен. Следовательно наследуется от QAbstractItemModel. А там он пустой должен быть
Записан
tem1k
Гость
« Ответ #6 : Ноябрь 10, 2009, 15:49 »

Вы не могли бы помочь предопределить данный метод...
« Последнее редактирование: Ноябрь 10, 2009, 17:21 от tem1k » Записан
tem1k
Гость
« Ответ #7 : Ноябрь 10, 2009, 17:22 »

Я начал делать вот так. Создал класс унаследованный от QAbstractItemModel. Имею там такую функцию

Код:
insertRowl(QDirModel *model, int position, int rows,  QModelIndex index)
{
    beginInsertRows(QModelIndex(), position, position+rows-1);

        for (int row = 0; row < rows; ++row) {
            model->children().insert(0,*что вставить сюда чтоб в итоге получить в модели строку ".."*);

        }

        endInsertRows();
}

Хотя бы подскажите, я на правильном пути ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #8 : Ноябрь 10, 2009, 17:29 »

если делается insertRow то сначала вставляется пустые данные. А затем делается setData на вставленные индексы. Но ткое поведение не шибко хорошо для DirModel (тк ее состоянием управляет ФС).
Кстати мб стоит сделать прокси-модель...
Записан
tem1k
Гость
« Ответ #9 : Ноябрь 10, 2009, 17:40 »

А можно ли сделать таким образом ?
Установить для DirModel флаги model->setFilter(QDir::Hidden | QDir::System | QDir::AllEntries); Тогда получим еще две строки: текущий каталог "." и парент "..". И удалить строку ".". Но насколько я понимаю удаляя индекс текущего каталога "." мы удалим из модели весь текущий каталог. Я прав или все таки ошибаюсь ?
Записан
bjaka_max
Гость
« Ответ #10 : Ноябрь 29, 2009, 09:43 »

Я это решил так:
Код:
        fileModel = new QDirModel;
        fileModel->setSorting(QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);
        fileModel->setFilter(QDir::Hidden | QDir::System | QDir::AllEntries);
        QStringList filters;
        filters << ".." << "[^\.]*";
        fileModel->setNameFilters(filters);
Не уверен что правильно но вроде работает. Только у меня софтина под линукс. А там то что с точки начинается скрытые файлы. Для винды соответственно наверное filters << ".." << "[^\.]"<< "??*";
« Последнее редактирование: Ноябрь 29, 2009, 10:19 от bjaka_max » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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