Russian Qt Forum
Июнь 16, 2024, 05:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: QTreeWidget - нажатие на узел дерева  (Прочитано 29806 раз)
BRE
Гость
« Ответ #30 : Февраль 25, 2009, 14:27 »

Нет, 3 состояния - перебор. У летчиков мозги съедут.
Это надуманная причина (нельзя недооценивать наших летчиков).  Смеющийся

Да и потом на таком принципе удобнее дальнейшую обработку вести (в смысле когда 2 состояния)!
А вот это явная причина... (удобней тебе).  Подмигивающий
Записан
AD
Гость
« Ответ #31 : Февраль 25, 2009, 14:35 »

Это надуманная причина (нельзя недооценивать наших летчиков).  Смеющийся

А вот это явная причина... (удобней тебе).  Подмигивающий
Да не недооцениваю я летчиков. Сам к ним в некотором роде отношусь! Улыбающийся Летчики - консерваторы. На старой программе было два состояния. Увидят три состояния испугаются. Не будут понимать, что за 3 состояние, откуда взялось! Чем проще работать с программой, тем большее количество людей ей пользуются....
Записан
Sergeich
Гость
« Ответ #32 : Февраль 25, 2009, 23:50 »

Насчет кода: код из работающего проекта, писался и отлаживался в течении получаса, причем по моей ленности была использована QStandardItemModel вместо QAbstractItemModel. Вроде работает.
По поводу трех состояний: без третьего никак нельзя. Поясняю: если (не)отмечаются все потомки у родителя ставится (снимается) галочка. Что делать если потомки выбраны через одного? Именно для этого и был придуман т.н. tristate.
Записан
AD
Гость
« Ответ #33 : Февраль 26, 2009, 12:20 »

Цитата: Sergeich
Насчет кода: код из работающего проекта, писался и отлаживался в течении получаса, причем по моей ленности была использована QStandardItemModel вместо QAbstractItemModel. Вроде работает.
По поводу трех состояний: без третьего никак нельзя. Поясняю: если (не)отмечаются все потомки у родителя ставится (снимается) галочка. Что делать если потомки выбраны через одного? Именно для этого и был придуман т.н. tristate.
Есть несколько вопросов. В связи с некоторыми деталями при работе с деревом этапов, увиденными сегодня, возникло желание перейти от QTreeWidget к QTreeView. Соответственно, хочется сделать так, как в указанном Вами коде. При этом сделать более корректно, т.е. используя QAbstractItemModel. Но проблема в том, что у этого класса нет сигнала itemChanged и им подобных. Как поступить в этом случае?
Записан
spirit
Гость
« Ответ #34 : Февраль 26, 2009, 12:23 »

как это нету? все есть  Улыбающийся
Цитировать
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )
This signal is emitted whenever the data in an existing item changes. The affected items are those between topLeft and bottomRight inclusive (of the same parent).
Note that this signal must be emitted explicitly when reimplementing the setData() function.
See also headerDataChanged(), setData(), and layoutChanged().
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #35 : Февраль 26, 2009, 12:32 »

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

А зачем переходить на QTreeView? Помоему QTreeWidget справляется с задачей неплохо, или ваша задача подразумевает оч большой объем данных?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
AD
Гость
« Ответ #36 : Февраль 26, 2009, 14:14 »

Посмотрел я на QAbstractItemModel и решил, что запутаюсь - решил, остаться на QStandardItemModel! Улыбающийся

А зачем переходить на QTreeView? Помоему QTreeWidget справляется с задачей неплохо, или ваша задача подразумевает оч большой объем данных?
Дело в том, что при переходе на модель-представление, очень большой кусок кода вынесется из класса TLV, который и так чересчур большой. Да и обработка отдельно взятого элемента, а не списка мне будет удобнее.
Записан
AD
Гость
« Ответ #37 : Февраль 26, 2009, 16:06 »

Насчет кода: код из работающего проекта, писался и отлаживался в течении получаса, причем по моей ленности была использована QStandardItemModel вместо QAbstractItemModel. Вроде работает.
По поводу трех состояний: без третьего никак нельзя. Поясняю: если (не)отмечаются все потомки у родителя ставится (снимается) галочка. Что делать если потомки выбраны через одного? Именно для этого и был придуман т.н. tristate.
Еще раз спасибо. Сделал через модель - представление. Подставил Ваш класс. Все работает на ура! Улыбающийся)))
Записан
Makss
Гость
« Ответ #38 : Июль 30, 2010, 21:21 »

тоже понадобилось такая весч, реализовывал сам, потом тему эту увидил, вот выкладываю, мож кому понадобится:
Код:
    if(item->checkState(0) == Qt::Checked) {
        selectItem(item);
    } else if(item->checkState(0) == Qt::Unchecked) {
        unselectItem(item);
    }
    QTreeWidgetItem *it = item;
    while(it->parent()) {
        const int count = it->parent()->childCount();
        bool hasPartiallyChecked = false,
             hasChecked = false,
             hasUnchecked = false;
        for(int i = 0; i < count; i++) {
            QTreeWidgetItem *itt = it->parent()->child(i);
            switch (itt->checkState(0)) {
            case Qt::Checked: hasChecked = true; break;
            case Qt::Unchecked: hasUnchecked = true; break;
            case Qt::PartiallyChecked: hasPartiallyChecked = true; break;
            }

            if(hasPartiallyChecked || (hasChecked && hasUnchecked)) {
                hasPartiallyChecked = true;
                break;
            }
        }
        it->parent()->setCheckState(0, hasPartiallyChecked ? Qt::PartiallyChecked :
                                    (!hasChecked ? Qt::Unchecked : Qt::Checked));
        if(it->parent()->checkState(0) == Qt::Checked ||
           it->parent()->checkState(0) == Qt::Unchecked) {
            for(int i = 0; i < count; i++) {
                it->parent()->child(i)->setCheckState(0, it->parent()->checkState(0));
            }
        }
        it = it->parent();
    }

Функции selectItem и unselectItem ставят и убирают соответственно, галочки у дочерних элементов,думаю ни кому не составит труда их написать, поэтому их не выкладываю

Код вполне рабочий, по крайней мере ситуаций отличных от правильной работы я не встречал
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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