Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Joss от Июль 30, 2009, 01:03



Название: [Решено] QSortFilterProxyModel и добавление строк в QTreeView
Отправлено: Joss от Июль 30, 2009, 01:03
Друзья,

замечательный форум! Подскажите, пожалуйста, новичку:

- Есть модель дерева на основе QAbstractItemModel.
- Строчку из одной ветки нужно переместить во вторую (реализовал через removeRows и insertRows).
- Если ветка не содержит внутренних элементов ее надо скрыть (реализовал через QSortFilterProxyModel - скрываю ветки у которых нет дочерних элементов).

Наверное у меня даже два вопроса, первый может быть глупый, но:

1. Работая с моделью (например, вызывая insertRows), мы должны какую модель использовать? Основную или прокси? Если прокси, то какую модель мы получаем вызовом QAbstractItemView::model () ?
2. Основная проблема - если ветка, куда мы хотим переместить строку скрыта в данный момент (т.к. она пустая) в модели-прокси, то у меня ничего не получается - т.е. вставка происходит помимо этой ветки, скрытая ветка так и не появляется (а должна по идее, когда в ней появляются дочерние элементы).

Постараюсь схематично:

--A1
----C1
----C2
- A2 (пустая, скрытая)

я хочу переместить C1 в A2 (удаляя элемент, вставляя в новую позицию и занося данные)

--A1
----C2
- A2 (эта ветка по идее должна появится, т.к. в прокси стоит проверка на число дочерних элементов, но она не появляется)
----C1

Вот, заранее спасибо за ответы!



Название: Re: QSortFilterProxyModel и добавление строк в QTreeView
Отправлено: Авварон от Июль 30, 2009, 08:59
вставлять надо в родную модель. прокси модель перестраивается на основе основной


Название: Re: QSortFilterProxyModel и добавление строк в QTreeView
Отправлено: Joss от Июль 30, 2009, 21:08
На часть вопросов сам получил ответы:

Цитировать
Работая с моделью (например, вызывая insertRows), мы должны какую модель использовать?
Насколько я понял, можно работать с любой моделью. Но если мы хотим использовать исходную модель, то нужно приводить текущий индекс через mapToSource к индексу исходной модели.

Цитировать
Если прокси, то какую модель мы получаем вызовом QAbstractItemView::model ()
Получаем модель прокси.

Но проблема вот в чем, если не использовать reset(), но новая строка не видна (вместе со скрытой веткой). А как обойтись без reset()?

Код insertRows в основной модели:
Код:
bool TreeModel::insertRows(int position, int rows, const QModelIndex &parent) {
    TreeItem *parentItem = getItem(parent);
    bool success;

    beginInsertRows(parent, position, position + rows - 1);
    success = parentItem->insertChildren(position, rows, rootItem->columnCount());
    endInsertRows();

    reset();
    return success;
}

Вот если оставить там reset() то все идеально работает - но это неправильно, да и модель сворачивается. Можно ли обойтись без reset()?


Название: Re: QSortFilterProxyModel и добавление строк в QTreeView
Отправлено: Joss от Июль 30, 2009, 21:14
Я нашел решение, заменив reset() на посылку сигнала layoutChanged ().
Но насколько это правильно и почему без этого не работало, я не понимаю.


Название: Re: [Решено] QSortFilterProxyModel и добавление строк в QTreeView
Отправлено: p166 от Ноябрь 03, 2009, 13:41
Самодостаточно...