Russian Qt Forum
Февраль 10, 2012, 16:09
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
(Модератор:
Sergeich
) >
QTreeWidget - нажатие на узел дерева
Страниц:
1
2
[
3
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QTreeWidget - нажатие на узел дерева (Прочитано 5271 раз)
BRE
Джедай : наставник для всех
Offline
Сообщений: 3056
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #30 :
Февраль 25, 2009, 14:27 »
Цитата: AD от Февраль 25, 2009, 14:16
Нет, 3 состояния - перебор. У летчиков мозги съедут.
Это надуманная причина (нельзя недооценивать наших летчиков).
Цитата: AD от Февраль 25, 2009, 14:16
Да и потом на таком принципе удобнее дальнейшую обработку вести (в смысле когда 2 состояния)!
А вот это явная причина... (удобней тебе).
Записан
AD
Гость
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #31 :
Февраль 25, 2009, 14:35 »
Цитата: BRE от Февраль 25, 2009, 14:27
Это надуманная причина (нельзя недооценивать наших летчиков).
А вот это явная причина... (удобней тебе).
Да не недооцениваю я летчиков. Сам к ним в некотором роде отношусь!
Летчики - консерваторы. На старой программе было два состояния. Увидят три состояния испугаются. Не будут понимать, что за 3 состояние, откуда взялось! Чем проще работать с программой, тем большее количество людей ей пользуются....
Записан
Sergeich
Moderator
Супер активный житель
Offline
Сообщений: 786
Сферический писец в вакууме
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #32 :
Февраль 25, 2009, 23:50 »
Насчет кода: код из работающего проекта, писался и отлаживался в течении получаса, причем по моей ленности была использована QStandardItemModel вместо QAbstractItemModel. Вроде работает.
По поводу трех состояний: без третьего никак нельзя. Поясняю: если (не)отмечаются все потомки у родителя ставится (снимается) галочка. Что делать если потомки выбраны через одного? Именно для этого и был придуман т.н. tristate.
Записан
AD
Гость
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #33 :
Февраль 26, 2009, 12:20 »
Цитата: Sergeich
Насчет кода: код из работающего проекта, писался и отлаживался в течении получаса, причем по моей ленности была использована QStandardItemModel вместо QAbstractItemModel. Вроде работает.
По поводу трех состояний: без третьего никак нельзя. Поясняю: если (не)отмечаются все потомки у родителя ставится (снимается) галочка. Что делать если потомки выбраны через одного? Именно для этого и был придуман т.н. tristate.
Есть несколько вопросов. В связи с некоторыми деталями при работе с деревом этапов, увиденными сегодня, возникло желание перейти от QTreeWidget к QTreeView. Соответственно, хочется сделать так, как в указанном Вами коде. При этом сделать более корректно, т.е. используя QAbstractItemModel. Но проблема в том, что у этого класса нет сигнала itemChanged и им подобных. Как поступить в этом случае?
Записан
spirit
Гипер активный житель
Offline
Сообщений: 845
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #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().
Записан
Qt Assistant -- rocks!
please, use tags
[
CODE
]
&
[
/CODE
]
.
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2864
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #35 :
Февраль 26, 2009, 12:32 »
Цитата: AD от Февраль 26, 2009, 12:20
Есть несколько вопросов. В связи с некоторыми деталями при работе с деревом этапов, увиденными сегодня, возникло желание перейти от QTreeWidget к QTreeView. Соответственно, хочется сделать так, как в указанном Вами коде. При этом сделать более корректно, т.е. используя QAbstractItemModel.
А зачем переходить на QTreeView? Помоему QTreeWidget справляется с задачей неплохо, или ваша задача подразумевает оч большой объем данных?
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
AD
Гость
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #36 :
Февраль 26, 2009, 14:14 »
Посмотрел я на QAbstractItemModel и решил, что запутаюсь - решил, остаться на QStandardItemModel!
Цитата: pastor от Февраль 26, 2009, 12:32
А зачем переходить на QTreeView? Помоему QTreeWidget справляется с задачей неплохо, или ваша задача подразумевает оч большой объем данных?
Дело в том, что при переходе на модель-представление, очень большой кусок кода вынесется из класса TLV, который и так чересчур большой. Да и обработка отдельно взятого элемента, а не списка мне будет удобнее.
Записан
AD
Гость
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #37 :
Февраль 26, 2009, 16:06 »
Цитата: Sergeich от Февраль 25, 2009, 23:50
Насчет кода: код из работающего проекта, писался и отлаживался в течении получаса, причем по моей ленности была использована QStandardItemModel вместо QAbstractItemModel. Вроде работает.
По поводу трех состояний: без третьего никак нельзя. Поясняю: если (не)отмечаются все потомки у родителя ставится (снимается) галочка. Что делать если потомки выбраны через одного? Именно для этого и был придуман т.н. tristate.
Еще раз спасибо. Сделал через модель - представление. Подставил Ваш класс. Все работает на ура!
)))
Записан
Makss
Самовар
Offline
Сообщений: 106
Re: QTreeWidget - нажатие на узел дерева
«
Ответ #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 ставят и убирают соответственно, галочки у дочерних элементов,думаю ни кому не составит труда их написать, поэтому их не выкладываю
Код вполне рабочий, по крайней мере ситуаций отличных от правильной работы я не встречал
Записан
Qt 4.7.2, Open Suse 11.4, Windows 7
Страниц:
1
2
[
3
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> Печать
=> Интернационализация, локализация
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
=> Архив
===> Программирование
=====> Python
===> Веб программирование
=====> PHP, PERL, CGI
Загружается...