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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Скрыть не используемую ветку в модели  (Прочитано 4882 раз)
UVV
Гость
« : Сентябрь 30, 2009, 06:33 »

Привет.
Фрагмент кода модели, унаследованной от QAbstractItemModel:
Код
C++ (Qt)
...
int ProjectInterface::rowCount ( const QModelIndex & parent ) const
{
   if (!parent.isValid()) {
       if (!m_moduleName.isEmpty()) {
           return 2;
       }
       else {
           return 1;
       }
   }
   ...
}
 
Отображаю эту модель я в TreeView. В данном случае хотелось бы вот что:
Есть 2 главных TreeItem. QString m_moduleName является вторым из них.
Нужно сделать так, что если он пустой, то эту ветвь не отображать вообще.
Как это сделать правильно?
Код, приведённый выше, работает не совсем корректно.
Записан
spectre71
Гость
« Ответ #1 : Сентябрь 30, 2009, 09:02 »

В момент изменения данных для модели проверять пуста ли соответствующая ветка и при изменении ее состояний пуста->заполнена или заполнена->пуста, посылать свой сигнал модели которая вызовет необходимые методы (remove.., insert.., reset,.. итд)
Записан
UVV
Гость
« Ответ #2 : Сентябрь 30, 2009, 09:45 »

Да, reset() там и не было. Спасибо Подмигивающий
Записан
spectre71
Гость
« Ответ #3 : Сентябрь 30, 2009, 09:58 »

Да, reset() там и не было. Спасибо Подмигивающий
Может лучше  beginRemoveRows/endRemoveRows и beginInsertRows/endInsertRows
Записан
Joss
Гость
« Ответ #4 : Сентябрь 30, 2009, 13:38 »

Я делал через QSortFilterProxyModel:

Код:
class TreeModelProxy : public QSortFilterProxyModel
{
    Q_OBJECT

public:
    TreeModelProxy(QObject* parent = 0) : QSortFilterProxyModel(parent) {}

protected:
    bool filterAcceptsRow(int sourceRow,  const QModelIndex &sourceParent) const;
};

Код:
bool TreeModelProxy::filterAcceptsRow(int sourceRow,  const QModelIndex &sourceParent) const {
    bool flag = true;
    ....
    QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);

    if (!sourceModel()->hasChildren(index)) {
        flag = false;
    }
    ....
return flag;

Чтобы прокси пересчитывалась при добавлении веток в пустой узел (или удалении), вызываю
Код:
emit layoutChanged();

в TreeModel::insertRows и TreeModel::removeRows.
Записан
UVV
Гость
« Ответ #5 : Октябрь 01, 2009, 05:17 »

Может лучше  beginRemoveRows/endRemoveRows и beginInsertRows/endInsertRows
Эффективнее?
А как быть со случаем, когда parent == root item?
Записан
UVV
Гость
« Ответ #6 : Октябрь 01, 2009, 06:51 »

Может лучше  beginRemoveRows/endRemoveRows и beginInsertRows/endInsertRows
Эффективнее?
А как быть со случаем, когда parent == root item?

Да, QModelIndex() и if (!parent.isValid()) помогли.
Тем не менее, вопрос про эффективность всё ещё в силе =)
Хотя я уже догадываюсь, что всё-таки без reset() эффективнее Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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