Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QGraphicsItem::setZValue тормоза 
:(
    Опции темы
becks
Дата 18.12.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Добрый день. Работаю с графами. Если добавлять на почти пустую сцену (до 1000 узлов) новую ветвь соединяющую любых два узла, то отрисовка этой ветви проходит моментально. Если же открываю из файла большой граф > 30 тыс элементов , то добавление новой ветви занимает 5-7 секунд, ну очень долго для такого примитивного мероприятия. Ветвь добавляю так:

Код

void Document::addEdge(Edge *edge)
{
    edge->setZValue(-1000.0);
    scene()->addItem(edge);

    edge->sourceNode()->addEdge(edge);
    edge->destNode()->addEdge(edge);

    emit addedEdge();
    m_editingMode = Select;
}


Заметил что если убрать setZValue, то никаких тормозов нет, ветка добавляется моментально. Пытался поиграться с передаваемым значением, разницы особо нет -10 это, или -1000, итог один - очень тормозит. Помещать ветви ниже всех узлов мне обязательно нужно иначе просто будет каша.

Прочитал на stackoverflow, что у сцены нужно выставить ItemIndexMethod в NoIndex

Код

scene->setItemIndexMethod(QGraphicsScene::NoIndex);


не помогло.

Собственно вопрос. Почему такие тормоза и как бороться? Спасибо.
PM MAIL   Вверх
math64
Дата 18.12.2012, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



А если вместо ZValue воспользоваться QGraphicsItemGroup и связи добавлять в группу, добавленную на сцену до добавления узлов?
(Не проверял)
Ещё можно воспользоваться scene->blockSignals(true); чтобы сцена не отсылала сигналы во время модификации.

Это сообщение отредактировал(а) math64 - 18.12.2012, 14:19
PM   Вверх
becks
Дата 18.12.2012, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата(math64 @  18.12.2012,  14:06 Найти цитируемый пост)
А если вместо ZValue воспользоваться QGraphicsItemGroup и связи добавлять в группу, добавленную на сцену до добавления узлов?
(Не проверял) 


С группами не работал, если правильно понял суть, при создании сцены первым делом добавляем в нее группу. Все ветки добавляем в группу, все узлы просто на сцену. Все так?

А можно будет потом веткам обращаться напрямую или нужно будет через группу как-то?
PM MAIL   Вверх
math64
Дата 18.12.2012, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Вот пример blockSignals() для  вращения грание кубика Рубика:

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  rubik.tar.gz 5,71 Kb
PM   Вверх
math64
Дата 18.12.2012, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Группа заменяет слой, группа связей будет находится под группой узлов, над ней можно разместить группу надписей и т.д.
Но для кубика Рубика у меня почему-то с группами не получилось (давно писал, не помню уже)

Это сообщение отредактировал(а) math64 - 19.12.2012, 08:28
PM   Вверх
becks
Дата 18.12.2012, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата(math64 @  18.12.2012,  14:06 Найти цитируемый пост)
А если вместо ZValue воспользоваться QGraphicsItemGroup и связи добавлять в группу, добавленную на сцену до добавления узлов?
(Не проверял)
Ещё можно воспользоваться scene->blockSignals(true); чтобы сцена не отсылала сигналы во время модификации.


Блокировку сигналов попробовал, не помогла. 

Сейчас быстренько создал группу, добавил ее. Группа помогла, ветви отрисовываются  быстро. Из минусов, которые сразу бросились в глаза, придется переделывать выделение объектов на сцене, теперь ветки не выделяются. Если добавлять узлы после открытия файла (кода уже граф добавлен), то ветки к ним не цепляются. Уверен и еще что-нибудь всплывет.

В любом случае спасибо за предложения. Может быть у кого-то будут еще варианты.

Это сообщение отредактировал(а) becks - 18.12.2012, 14:45
PM MAIL   Вверх
Amp
Дата 18.12.2012, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Родитель у Edge кто? Если его нет, то я бы сделал им один из узлов. Потому что если все элементы в иерархии сцен-графа находятся на одном (и единственном) уровне, то изменение z-положения одного из них приведет к пересортировке всех узлов. Вариант с QGraphicsItemGroup кстати это же и делает - хоть как-то разделяет узлы в сцене.

Это сообщение отредактировал(а) Amp - 18.12.2012, 21:05
PM MAIL   Вверх
math64
Дата 19.12.2012, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Ещё можно
1. Рисовать соединения в drawBackground(), а сами соединения сделать прозрачными, но shape() соединения выдаёт его форму, чтобы его можно было выделить.
2. Сделать свой классы, производные от QGraphicsItemGroup и QGraphicsScene и отрабатывать в них нажатия мыши, чтобы выделялись соединения, а не группа. 


Это сообщение отредактировал(а) math64 - 19.12.2012, 08:49
PM   Вверх
Amp
Дата 19.12.2012, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



3. Забить на QGraphicsScene и выводить все самому через QPainter smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.