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

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

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

Сообщений: 11445


Просмотр профиля
« : Февраль 23, 2014, 14:44 »

Добрый день

Мелочевка, легко решается наследованием от QTreeWidgetItem (которое мне все равно необходимо), но все же: есть ли штатная возможность указать ноду что он может (или не может) иметь children? Потому что часто возникает ситуация когда добавляется "нод-контейнер" и "нод-лист", это по задаче известно. Если такой возможности/опции нет, то насколько стремно добавить новый флажок в flags? Вроде там "user" не обозначено...

Спасибо
Записан
popper
Гость
« Ответ #1 : Февраль 23, 2014, 16:50 »

В Qt5 появился флаг Qt::ItemNeverHasChildren, но из документации не ясно, на какие ситуации он распространяется.
Записан
Hrundel
Гость
« Ответ #2 : Февраль 23, 2014, 19:24 »

Не понимаю, почему ищешь штатную функцию?
« Последнее редактирование: Февраль 23, 2014, 19:54 от Hrundel » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 24, 2014, 10:34 »

Не понимаю, почему ищешь штатную функцию?
Сейчас приходится делать так
Код
C++ (Qt)
MyItem * i2 = dynamic_cast <MyItem *> (item);
if (i2 && i2->IsFolder()) {    // is a container?
...
}
Что конечно не смертельно, но лучше было бы так
Код
C++ (Qt)
if ((item->flags() & Qt::ItemNeverHasChildren) == 0) {
...
 
Записан
Bepec
Гость
« Ответ #4 : Февраль 24, 2014, 11:37 »

Устанавливай свой флаг в setData(Qt::UserRole...) И никакого наследования.
Записан
Hrundel
Гость
« Ответ #5 : Февраль 24, 2014, 12:13 »

но лучше было бы так
Код
C++ (Qt)
if ((item->flags() & Qt::ItemNeverHasChildren) == 0) {
...
 

Проще! Да и выглядит в разы понятнее.
« Последнее редактирование: Февраль 24, 2014, 12:15 от Hrundel » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 24, 2014, 12:36 »

Устанавливай свой флаг в setData(Qt::UserRole...) И никакого наследования.
А в какой колонке? Их число запросто может меняться. Так что может не стоит столь уверенно предлагать совсем уж плохонький "костылек"?  Улыбающийся
Записан
Bepec
Гость
« Ответ #7 : Февраль 24, 2014, 13:33 »

Почему костылёк? Нулевая колонка будет всегда у итема. Нет у него состояния, когда её нет.
К тому же костылёк это наследование. А тут использование имеющегося и предназначенного именно для пользовательской роли функционала.
PS сумеете сделать итем без нулевой колонки, я вам спасибо скажу и удивлюсь Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 25, 2014, 10:28 »

К тому же костылёк это наследование. А тут использование имеющегося и предназначенного именно для пользовательской роли функционала.
Так это ф-ционал "одного поля" (колонки), а нужен для "всей записи" (айтема). Как следствие нужно будет отследить не грохнут ли колонку "на ходу" (таких случаев мало но есть). И даже без этого использование QVariant часто оказывается худшим решением.
Код
C++ (Qt)
if (item->data(0, Qt::UserRole) == true)  // item can have children
 
Догадаться что это - мудрено. Следующая попытка использовать UserRole может ничего не знать о предыдущей, и никаких сообщений выдано не будет, все ошибки загнаны в runtime. Чем меньше QVariant - тем лучше
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Февраль 25, 2014, 11:00 »

Код
C++ (Qt)
if (item->data(0, Qt::UserRole) == true)  // item can have children
 
Догадаться что это - мудрено. Следующая попытка использовать UserRole может ничего не знать о предыдущей, и никаких сообщений выдано не будет, все ошибки загнаны в runtime. Чем меньше QVariant - тем лучше
Открою Вам секрет. Пользовательских ролей может быть великое множество)
Никто не мешает завести свои собственные типа
Код
C++ (Qt)
enum { IgorsRoleItemCanHaveChildren = Qt::UserRole + 1000 };
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #10 : Февраль 25, 2014, 13:37 »

Прикольно смотреть как человек упорствует и не желает применять сделанную для него же функцию Веселый

И открою вам секрет - нельзя уничтожить первую колонку. Её можно лишь очистить, зная ваш номер UserRole и не более того. Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Февраль 25, 2014, 14:39 »

Открою Вам секрет. Пользовательских ролей может быть великое множество)
Никто не мешает завести свои собственные типа
Код
C++ (Qt)
enum { IgorsRoleItemCanHaveChildren = Qt::UserRole + 1000 };
Аккуратность никогда не помешает, но все равно я получаю "шкатулку с секретом", нет уж, спасибо, не надо. А то что их может быть "великое множество" меня никогда не радовало - значит реализация "жирная", и если айтемов много - тормоза будут.

Прикольно смотреть как человек упорствует и не желает применять сделанную для него же функцию Веселый
А Вам не кажется что использование QVariant для хранения битового флага уже ложится на программиста позорным пятном?  Улыбающийся
Записан
Bepec
Гость
« Ответ #12 : Февраль 25, 2014, 17:04 »

1) вы получаете только то, что используете. Стандартный функционал QTreeWidgetItem.
И вдобавок хотите вы того или нет, QTreeWidget НЕ РАССЧИТАН на большое количество итемов. Там больше 10к уже тормоза как ни странно. Так что ваше "позорное пятно" можете ложить на Qt и всех окружающих.

2) Это не относится к теме.
А так я не считаю позорным сохранить пару байт памяти в угоду потерянным своим часам. Ибо Qt жрёть ресурсы больше, чем я съэкономлю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Февраль 25, 2014, 18:35 »

Чтобы не плодить тем, вот немного сходная задача. Сейчас я переделываю на QTreeWidget (Item) старый элемент UI (что был без Qt). С точки зрения клиента это выглядит так
Код
C++ (Qt)
class OldTree {
public:
// флаги колонок
enum {
 FLAG_COLUMN_ENABLED,
 FLAG_COLUMN_LOCKED,
 FLAG_COLUMN_NUMBER,
 FLAG_COLUMN_TEXT,
 ...
};
OldTree( int flags );   // какие колонки создавать
void addColumn( int flag );   // добавить колонку на ходу
void remColumn( int flag );   // удалить
...
};
 
class OldTreeItem {
public:
bool  IsEnabled( void ) const;  // возвращает значение в колонке  ENABLED
void  SetEnabled( bool );      // устанавливает значение в колонке  ENABLED
 
// так же для всех др колонок
};
 
Как мне сохранить интерфейс OldTreeItem (с учетом что теперь он порожден от QTreeWidgetItem)?

Спасибо
Записан
Bepec
Гость
« Ответ #14 : Февраль 25, 2014, 18:40 »

Как душе угодно сохраняйте. Никто ж вам не запрещает. Только удалять колонки вы не сможете, вы будете их очищать. Вот и всё.

А псевдокод адаптации я писать не буду - и ежу ясно setText() и прочая.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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