Название: Дерево с чекбоксами. Отправлено: White Owl от Декабрь 19, 2014, 00:30 Qt 5.2.0 и 5.4.0
Мне нужно дерево, каждая ветка и лист которого имеет чекбокс. Галочки на каждой ветке/листе должны зависеть от состояния родителей/детей. Делаю на основе QTreeWidget: Код: twiBranch = new QTreeWidgetItem("branch"); Никаких сигналов не перехватываю. Полученное дерево хорошо реагирует на установку/снятие галочек на листах. Все ветки вплоть до корня правильно меняют свои состояния между Unchecked, PartiallyChecked и Checked. А вот если я кликаю (мышой или с клавиатуры) на ветку, то эта ветка меняет статус: Unchecked, PartiallyChecked, Checked, Unchecked, PartiallyChecked и дальше по кругу. При этом, когда ветка принимает значение PartiallyChecked, то и все дети тоже становятся PartiallyChecked. Спрашивается, кто виноват и что делать? Как убедить ветки дерева чтобы они при клику по этой ветке меняли свое значение только между Checked и Unchecked? Название: Re: Дерево с чекбоксами. Отправлено: gil9red от Декабрь 19, 2014, 00:58 Как убедить ветки дерева чтобы они при клику по этой ветке меняли свое значение только между Checked и Unchecked? Цитировать Qt::ItemIsTristate Отмечаемый элемент с тремя различными состояниями. Т.е. вам нужно только Qt::ItemIsUserCheckable использовать. Название: Re: Дерево с чекбоксами. Отправлено: __Heaven__ от Декабрь 19, 2014, 08:19 Убрать родителю частичный чек. если не поможет, то отлавливать его сигнал изменения и оперировать детьми
Название: Re: Дерево с чекбоксами. Отправлено: White Owl от Декабрь 19, 2014, 19:13 Если я убираю с ветки Qt::ItemIsTristate, то она (ветка) никогда и не становится PartiallyChecked, даже когда половина детей отмечана, а половина не отмечена.
Ну вот собственно говоря. Простенький пример с которым я играюсь: Код: #include <QtGui> Попробуйте пожалуйста этот код на Qt ранее чем 5.2, может это свеженький баг? В принципе я могу попробовать откатится на 4.8, но не уверен стоит ли. Может кто-нибудь писал правильно ведущую себя checkbox-tree модель? Название: Re: Дерево с чекбоксами. Отправлено: White Owl от Декабрь 19, 2014, 19:22 Убрать родителю частичный чек. если не поможет, то отлавливать его сигнал изменения и оперировать детьми Пробовал... Но тут я застрял на вопросе: а как понять где юзер чекнул?Если я перехватываю сигнал itemChanged(QTreeWidgetItem*,int), а потом меняю галочки на детях - дети сами получают itemChanged сигнал. Но кроме детей мне надо обновить и родителей... А вот тут и начинается чехарда с рекурсией. Когда каждый ребенок получает itemChanged сигнал, и в свою очередь пытается обновить своих родителей. А родители тоже все считают что чекнули их и идут обновлять детей и родителей... В общем, я запутался, извините... Название: Re: Дерево с чекбоксами. Отправлено: __Heaven__ от Декабрь 21, 2014, 01:58 Вы же можете понять, кто нажат, родитель или потомок... Если родитель, то оперировать с детьми. Если потомок, то проверить что с остальными потомками и дать действие родителю.
Название: Re: Дерево с чекбоксами. Отправлено: _OLEGator_ от Декабрь 21, 2014, 13:03 Я бы не городил огород и изначально отделил модель и преставление, взяв QTreeView и QAbstractItemModel.
И чтобы не было рекурсии, достаточно проверять, изменил ли свое состояние элемент или оно равно текущему. Название: Re: Дерево с чекбоксами. Отправлено: Igors от Декабрь 21, 2014, 13:12 А вот тут и начинается чехарда с рекурсией. Она начинается и в исходниках Qt, т.е. это нормально. Заводится флажок, если он установлен то itemChanged игнорируется. А вообще как-то грустно что такое заслужило обсуждения. Вывел формулуЦитировать мощность_инструментария * усилия_программиста = постоянная_величина |