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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] QSortFilterProxyModel и добавление строк в QTreeView  (Прочитано 5899 раз)
Joss
Гость
« : Июль 30, 2009, 01:03 »

Друзья,

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

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

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

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

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

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

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

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

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

« Последнее редактирование: Август 07, 2009, 22:59 от Joss » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июль 30, 2009, 08:59 »

вставлять надо в родную модель. прокси модель перестраивается на основе основной
Записан
Joss
Гость
« Ответ #2 : Июль 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()?
Записан
Joss
Гость
« Ответ #3 : Июль 30, 2009, 21:14 »

Я нашел решение, заменив reset() на посылку сигнала layoutChanged ().
Но насколько это правильно и почему без этого не работало, я не понимаю.
Записан
p166
Гость
« Ответ #4 : Ноябрь 03, 2009, 13:41 »

Самодостаточно...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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