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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidgetItem поведение родителей и детей  (Прочитано 2755 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Февраль 21, 2015, 19:52 »

Привет, друзья!
У меня в дереве имеется итем-родитель с флагом тристэйт и пару детей без этого флага.

если у детей стоят разные галки, то родитель становится полувыбранным.
При нажатии на чекбокс родителя, когда он переходит в полувыбранное положение, все дети тоже становятся полувыбранными.

Хочу узнать, как для родителя сохранить тристэйт только для случаев, когда чекстэйт детей разнится, а когда родитель получает клик - он имеет только вкл/выкл.

Также хотел бы узнать, как мне заглушить сигналы на детей, если был изменен родитель (в следствие чего тронуты дети).
Записан
CriDos
Гость
« Ответ #1 : Февраль 23, 2015, 12:34 »

Я у себя так вот сделал, для двухуровневого дерева Веселый
Код:
// Реализация выбора элементов в дереве зависимостей
void MainWindow::on_treeWidget_itemChanged(QTreeWidgetItem* item, int column)
{
    // Блокируем сигналы дерева зависимостей (treeWidget),
    // дабы избежать рекурсии при ручном управлении состоянием элементов.
    ui->treeWidget->blockSignals(true);

    // Изменяем состояние дочерних элементов
    const int childCount = item->childCount();
    for (int i = 0; i < childCount; i++)
        item->child(i)->setCheckState(column, item->checkState(column));
   
    // Установка статусов Qt::Checked, Qt::Unchecked, Qt::PartiallyChecked
    QTreeWidgetItem* root = item->parent();
    if (root && (root != item)) {
        const int childCount = root->childCount();
        int checkedCount = 0;

        // Считаем общее к-во элементов с установленным статусом - Qt::Checked
        for (int i = 0; i < childCount; i++)
            if (root->child(i)->checkState(column) == Qt::Checked)
                ++checkedCount;

        // В зависимости от checkedCount,
        // устанавливаем статус главному элементу.
        if (checkedCount == childCount)
            root->setCheckState(column, Qt::Checked);
        else if (checkedCount == 0)
            root->setCheckState(column, Qt::Unchecked);
        else
            root->setCheckState(column, Qt::PartiallyChecked);
    }

    ui->treeWidget->blockSignals(false);
}

« Последнее редактирование: Февраль 23, 2015, 16:24 от CriDos » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Февраль 23, 2015, 18:31 »

Я у себя так вот сделал, для двухуровневого дерева Веселый
Спасибо. Это как раз мой случай.
Совершенно забыл про существование blockSignals
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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