crossplatform.ru

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

> [РЕШЕНО] Дерево и скролл, Несколько косметических вопросов)
Elfinit
  опции профиля:
сообщение 20.12.2009, 0:06
Сообщение #1


Участник
**

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

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




Репутация:   1  


Доброго всем времени суток!
У меня 4 вопроса:
1. Есть QTreeWidget. У него, как я понял, по умолчанию есть скрол. Так вот он мне не нужен. Мне надо, чтобы при expand-е или collaps-е меняло размер само дерево,а вертикальный скрол вообще появляться не должен. Как сделать?
2. Никак не хочет появляться горизонтальный скрол(
3. У дерева слишком большие отступы при переходе к очередному уровню. Их можно как-то уменьшить? Желательно, чтобы картинка-branch была прямо под первой буквой родительского узла, а можно даже ещё левее.
4. Можно ли как-то сделать, чтобы вертикальный скрол появлялся не справа, а слева. Соответственно, горизонтальный - не снизу, а сверху.

Заранее спасибо))

Сообщение отредактировал Elfinit - 21.12.2009, 11:49
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Elfinit
  опции профиля:
сообщение 21.12.2009, 11:45
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 8.1.2025, 11:30