Russian Qt Forum

Qt => Общие вопросы => Тема начата: tem1k от Ноябрь 10, 2009, 14:04



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

Заранее благодарен.


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: Авварон от Ноябрь 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);
т.е. парент в твоем случае - это индекс, ассоциированный с папкой в которую хочешь вставить ".."


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: tem1k от Ноябрь 10, 2009, 14:48
Спасибо за объяснение. Теперь примерно я понимаю. Следовательно для вставки, допустим по даблклику я должен писать так:
Код:
void F_MainWindow::on_TreeView_doubleClicked(QModelIndex index)
{
     ...

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

я правильно понял ?


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: Авварон от Ноябрь 10, 2009, 14:54
это вставит 1 ряд _внутрь_ индекса, по которому кликнул. Т.е. в случае папки создаст подпапку, в случае файла сделает ряд внутри файла (что немного сносит мозг:))
Я кстати не уверен, что можно так с дир моделью извращаться) Если получится, напиши обязательно, мне тоже надо бы ".." в моей модели реализовать, но не переписывая структуру дерева


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: tem1k от Ноябрь 10, 2009, 15:03
Понятно. Но дело в том что 
Код:
qDebug() << ui.treeView->model()->insertRow(0,index);
возвращает false. То есть, если я понял правильно, вставить строку в QDirModel простыми средствами вставить не получится ?


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: Авварон от Ноябрь 10, 2009, 15:08
ну как минимум у QDirModel этот метод не переопределен. Следовательно наследуется от QAbstractItemModel. А там он пустой должен быть


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: tem1k от Ноябрь 10, 2009, 15:49
Вы не могли бы помочь предопределить данный метод...


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: tem1k от Ноябрь 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();
}

Хотя бы подскажите, я на правильном пути ?


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: Авварон от Ноябрь 10, 2009, 17:29
если делается insertRow то сначала вставляется пустые данные. А затем делается setData на вставленные индексы. Но ткое поведение не шибко хорошо для DirModel (тк ее состоянием управляет ФС).
Кстати мб стоит сделать прокси-модель...


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: tem1k от Ноябрь 10, 2009, 17:40
А можно ли сделать таким образом ?
Установить для DirModel флаги model->setFilter(QDir::Hidden | QDir::System | QDir::AllEntries); Тогда получим еще две строки: текущий каталог "." и парент "..". И удалить строку ".". Но насколько я понимаю удаляя индекс текущего каталога "." мы удалим из модели весь текущий каталог. Я прав или все таки ошибаюсь ?


Название: Re: QDirModel + insertRow. Помогите, не могу вставить строку.
Отправлено: bjaka_max от Ноябрь 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 << ".." << "[^\.]"<< "??*";