Russian Qt Forum

Qt => Model-View (MV) => Тема начата: UVV от Сентябрь 30, 2009, 06:33



Название: Скрыть не используемую ветку в модели
Отправлено: 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 является вторым из них.
Нужно сделать так, что если он пустой, то эту ветвь не отображать вообще.
Как это сделать правильно?
Код, приведённый выше, работает не совсем корректно.


Название: Re: Скрыть не используемую ветку в модели
Отправлено: spectre71 от Сентябрь 30, 2009, 09:02
В момент изменения данных для модели проверять пуста ли соответствующая ветка и при изменении ее состояний пуста->заполнена или заполнена->пуста, посылать свой сигнал модели которая вызовет необходимые методы (remove.., insert.., reset,.. итд)


Название: Re: Скрыть не используемую ветку в модели
Отправлено: UVV от Сентябрь 30, 2009, 09:45
Да, reset() там и не было. Спасибо ;)


Название: Re: Скрыть не используемую ветку в модели
Отправлено: spectre71 от Сентябрь 30, 2009, 09:58
Да, reset() там и не было. Спасибо ;)
Может лучше  beginRemoveRows/endRemoveRows и beginInsertRows/endInsertRows


Название: Re: Скрыть не используемую ветку в модели
Отправлено: Joss от Сентябрь 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.


Название: Re: Скрыть не используемую ветку в модели
Отправлено: UVV от Октябрь 01, 2009, 05:17
Может лучше  beginRemoveRows/endRemoveRows и beginInsertRows/endInsertRows
Эффективнее?
А как быть со случаем, когда parent == root item?


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

Да, QModelIndex() и if (!parent.isValid()) помогли.
Тем не менее, вопрос про эффективность всё ещё в силе =)
Хотя я уже догадываюсь, что всё-таки без reset() эффективнее ;)