crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> [РЕШЕНО] Дерево и скролл, Несколько косметических вопросов)
igor_bogomolov
  опции профиля:
сообщение 21.12.2009, 10:24
Сообщение #11


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Есть такие методы:
bool QTreeView::isExpanded ( const QModelIndex & index ) const
QRect QTreeView::visualRect ( const QModelIndex & index ) const   [virtual]

По моему, их вполне достаточно, что бы написать алгоритм подсчета количества отображаемых строк. :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 21.12.2009, 11:45
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Итак, решение получилось такое:
1. Реализация экспанда/коллапса осуществляется использованием следующих методов:
/* static */
int FoldersTree::getVisibleChildsCount(QTreeWidgetItem *item)
{
// нужно вычислить, сколько всего открытых потомков у узла, до уровня листьев дерева
    int childs_count = item->childCount();
    int hidden_childs = childs_count;
    for (int i=0;i<childs_count;i++) {
        QTreeWidgetItem *ti = item->child(i);
        if (ti->isExpanded()) {
            hidden_childs += getVisibleChildsCount(ti);
        }
    }
    return hidden_childs;
}

//пересчёт размера
void FoldersTree::recalculateGeometry()
{
    int new_height = qMax(200, shown_rows*FolderTreeItem::folder_tree_item_height);
    setMinimumHeight(new_height);
    setMaximumHeight(new_height);
}

//отлов сворачивания/разворачивания узлов
void FoldersTree::treeItemExpanded(QTreeWidgetItem *item)
{
    ((FolderTreeItem*)item)->load();
    shown_rows += getVisibleChildsCount(item);
    recalculateGeometry();
}

void FoldersTree::treeItemCollapsed(QTreeWidgetItem *item)
{
    shown_rows -= getVisibleChildsCount(item);
    recalculateGeometry();
}

// слоты-обработчики вставки/удаления в дерево/из дерева
void FoldersTree::insertedChild(FolderTreeItem *to, FolderTreeItem *item)
{
    if (to->isExpanded()) {
        shown_rows += getVisibleChildsCount(item);
        recalculateGeometry();
    }
}

void FoldersTree::removedChild(FolderTreeItem *from, FolderTreeItem *item)
{
    if (from->isExpanded()) {
        shown_rows -= getVisibleChildsCount(item);
        recalculateGeometry();
    }
}


2-3. Благодаря setIndentation проблема решилась, и необходимость в горизонтальном скроле отпала.

4. setLayoutDirection по методу, описанному igor_bogomolov

Сообщение отредактировал Elfinit - 21.12.2009, 11:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


12 чел. читают эту тему (гостей: 12, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 7.1.2025, 9:29