Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: __Heaven__ от Февраль 21, 2015, 19:52



Название: QTreeWidgetItem поведение родителей и детей
Отправлено: __Heaven__ от Февраль 21, 2015, 19:52
Привет, друзья!
У меня в дереве имеется итем-родитель с флагом тристэйт и пару детей без этого флага.

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

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

Также хотел бы узнать, как мне заглушить сигналы на детей, если был изменен родитель (в следствие чего тронуты дети).


Название: Re: QTreeWidgetItem поведение родителей и детей
Отправлено: CriDos от Февраль 23, 2015, 12:34
Я у себя так вот сделал, для двухуровневого дерева :D
Код:
// Реализация выбора элементов в дереве зависимостей
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);
}



Название: Re: QTreeWidgetItem поведение родителей и детей
Отправлено: __Heaven__ от Февраль 23, 2015, 18:31
Я у себя так вот сделал, для двухуровневого дерева :D
Спасибо. Это как раз мой случай.
Совершенно забыл про существование blockSignals