Russian Qt Forum

Qt => Model-View (MV) => Тема начата: OKTA от Август 07, 2014, 10:13



Название: [РЕШЕНО] QTreeWidget
Отправлено: OKTA от Август 07, 2014, 10:13
Товарищи, приветствую! Что-то сегодня логика не проснулась вместе со мной утром  :'(
Добавляю в QTreeWidget кучу айтемов с виджетами - в итоге естественно происходит подвисание интерфейса.
Вопрос - как бы так изловчиться, чтобы показать модальное окно с просьбой подождать или прогрессбар, а в фоне продолжать добавление айтемов?
ProcessEvents использовать?  ??? Загвоздка как раз в том, что происходит добавление айтемов с виджетами и выкинуть в отдельный поток не получается  >:(


Название: Re: QTreeWidget
Отправлено: Igors от Август 07, 2014, 10:26
... и выкинуть в отдельный поток не получается  >:(
Почему "раз заучив надо всегда так делать"? :) Никто не мешает показывать тот же QProgressDialog в той же главной нитке, т.е. синхронно - это даже намного проще


Название: Re: QTreeWidget
Отправлено: Bepec от Август 07, 2014, 10:31
Выпихиваем на 1 план модальный прогресс бар, потом каждые N итемов делаем qApp->processEvents. Зависания интерфейса не будет. Точнее N определите опытным путём.

К примеру при добавлении 100 итемов можно спокойной через каждый 10 итем.


Название: Re: QTreeWidget
Отправлено: OKTA от Август 07, 2014, 10:58
Ну, вы меня успокоили, значит ProcessEvents  :)
Вспомнилось вдруг... давненько делал тестовое задание в какой-то фирме и там была аналогичная проблема - и делал как раз через ProcessEvents, но принимающий человек заявил, что это непрофессионально и надо использовать потоки  :D


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Пантер от Август 07, 2014, 11:09
Ну, вы меня успокоили, значит ProcessEvents  :)
Не слушай их, это костыль.

Выкидываешь QTreeWidget и юзаешь QAbstractItemModel + QTreeView.


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Bepec от Август 07, 2014, 11:13
Аха... И пишешь свой QTreeWidget :)

TreeView+ model имеет где то % 30 функционала TreeWidget :) 70% переписывать это охохо :D


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Old от Август 07, 2014, 11:18
Аха... И пишешь свой QTreeWidget :)

TreeView+ model имеет где то % 30 функционала TreeWidget :) 70% переписывать это охохо :D
А зачем его переписывать? Вьюшка и модель самодостаточны.


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Bepec от Август 07, 2014, 11:51
Повторюсь
Цитировать
TreeView+ model имеет где то % 30 функционала TreeWidget :) 70% переписывать это охохо :D

Голая View + model заставит тебя переписывать уже имеющийся функционал TreeWidget. Вместо 1 сущности будет две, причём работоспособность данного создания будет целиком на создателе. Т.е. его надо отдебажить, проверить на утечки, потом ещё раз отдебажить. Потом наткнуться на какую нить бяку и ещё пару дней провести в увлекательных "приключения на своём велосипеде".

PS я уверен, что при написании своего QTreeWidget % 80 напишется легко. А вот потом потребуется знание механики => чтение манулов => расширение кругозора => время проведенное с пользой, но... => проект стоит и не движется :D


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: kambala от Август 07, 2014, 12:30
с кастомной моделью производительность значительно увеличится, особенно при использовании виджетов в айтемах (сам в этом убедился). и далеко не всегда нужно переписывать весь тривиджет.


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: OKTA от Август 07, 2014, 12:35
Сейчас попробую!


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Old от Август 07, 2014, 12:47
с кастомной моделью производительность значительно увеличится, особенно при использовании виджетов в айтемах (сам в этом убедился). и далеко не всегда нужно переписывать весь тривиджет.
Да его вообще переписывать не надо. Нужно просто написать свою модель, все остальное сделает вьюшка.


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: OKTA от Август 07, 2014, 16:46
На сколько человечно в айтемах модели хранить указатели на виджеты, чтобы потом отрисовывать их в делегате через paint?


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Bepec от Август 07, 2014, 17:39
Я думаю человечно, если это сохранит мне 3-7 часов моего времени :)

А если серьёзно - так указатели же. Это ничем не отличается от простой отрисовки в paint'e. Во всяком случае в плане быстродействия.

PS я вот однажды динамический компоновщик писал и ради прикола поставил 10к кнопок на формочку. Вот это был ад :D


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: OKTA от Август 07, 2014, 17:46
 ;D не, 10К еще рановато для моей конструкции  ;D


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Johnik от Август 08, 2014, 06:27
На сколько человечно в айтемах модели хранить указатели на виджеты, чтобы потом отрисовывать их в делегате через paint?

а почему не создавать/уничтожать их в нужный момент в делегате?


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Bepec от Август 08, 2014, 13:08
Потому что делегат именно это и делает :D Вот только не всегда нужно "создавать по случаю", иногда ещё нужно чтобы все видимые ячейки имели уже созданный виджет.


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Old от Август 08, 2014, 13:31
иногда ещё нужно чтобы все видимые ячейки имели уже созданный виджет.
Это для чего, например?


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Bepec от Август 08, 2014, 13:33
Открываем торрент - видим поле со звёздочками. Если создавать и уничтожать их динамически, это съест больше ресурсов, чем просто их отрисовка. Тем более тогда возникает проблема с прокручиваниями (вроде). Пробовал я динамикой их создавать, прокрутка на конец списка выводит комп на суперпозицию вроде работает, а вроде нет :D


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Old от Август 08, 2014, 13:35
Открываем торрент - видим поле со звёздочками. Если создавать и уничтожать их динамически, это съест больше ресурсов, чем просто их отрисовка. Тем более тогда возникает проблема с прокручиваниями (вроде). Пробовал я динамикой их создавать, прокрутка на конец списка выводит комп на суперпозицию вроде работает, а вроде нет :D
Вот именно для этого и нужны делегаты.
Даже в Qt-шных примерах это делает делегат.
Никакого смысла в 100500 виджетах для каждой ячейки нет.



Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Bepec от Август 08, 2014, 14:14
Ну делегат позволяет только отрисовывать. Реагировать на что-либо и получать сигналы может он лишь когда ты ручками пропишешь. А виджет снимает эту нагрузку.


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Old от Август 08, 2014, 14:15
Ну делегат позволяет только отрисовывать. Реагировать на что-либо и получать сигналы может он лишь когда ты ручками пропишешь. А виджет снимает эту нагрузку.
Так делегат и виджеты создает. только не 100500, а один - активный в текущий момент.



Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: kambala от Август 08, 2014, 18:42
Открываем торрент - видим поле со звёздочками.
какой торрент и какие звездочки?


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: Bepec от Август 08, 2014, 18:59
to Kambala - в некоторых версиях торрентов имеется поле "популярность" у торрента. Оно отображается в виде звёзд от 1 до 5/10 :)


Название: Re: [РЕШЕНО] QTreeWidget
Отправлено: kambala от Август 08, 2014, 19:01
я этот столбик отключил как только его увидел