![]() |
|
|
![]()
|
|
| becks |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 6.7.2010 Репутация: нет Всего: нет |
Добрый день. Работаю с графами. Если добавлять на почти пустую сцену (до 1000 узлов) новую ветвь соединяющую любых два узла, то отрисовка этой ветви проходит моментально. Если же открываю из файла большой граф > 30 тыс элементов , то добавление новой ветви занимает 5-7 секунд, ну очень долго для такого примитивного мероприятия. Ветвь добавляю так:
Заметил что если убрать setZValue, то никаких тормозов нет, ветка добавляется моментально. Пытался поиграться с передаваемым значением, разницы особо нет -10 это, или -1000, итог один - очень тормозит. Помещать ветви ниже всех узлов мне обязательно нужно иначе просто будет каша. Прочитал на stackoverflow, что у сцены нужно выставить ItemIndexMethod в NoIndex
не помогло. Собственно вопрос. Почему такие тормоза и как бороться? Спасибо. |
||||
|
|||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
А если вместо ZValue воспользоваться QGraphicsItemGroup и связи добавлять в группу, добавленную на сцену до добавления узлов?
(Не проверял) Ещё можно воспользоваться scene->blockSignals(true); чтобы сцена не отсылала сигналы во время модификации. Это сообщение отредактировал(а) math64 - 18.12.2012, 14:19 |
|||
|
||||
| becks |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 6.7.2010 Репутация: нет Всего: нет |
С группами не работал, если правильно понял суть, при создании сцены первым делом добавляем в нее группу. Все ветки добавляем в группу, все узлы просто на сцену. Все так? А можно будет потом веткам обращаться напрямую или нужно будет через группу как-то? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Вот пример blockSignals() для вращения грание кубика Рубика:
Присоединённый файл ( Кол-во скачиваний: 4 )
rubik.tar.gz 5,71 Kb |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Группа заменяет слой, группа связей будет находится под группой узлов, над ней можно разместить группу надписей и т.д.
Но для кубика Рубика у меня почему-то с группами не получилось (давно писал, не помню уже) Это сообщение отредактировал(а) math64 - 19.12.2012, 08:28 |
|||
|
||||
| becks |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 6.7.2010 Репутация: нет Всего: нет |
Блокировку сигналов попробовал, не помогла. Сейчас быстренько создал группу, добавил ее. Группа помогла, ветви отрисовываются быстро. Из минусов, которые сразу бросились в глаза, придется переделывать выделение объектов на сцене, теперь ветки не выделяются. Если добавлять узлы после открытия файла (кода уже граф добавлен), то ветки к ним не цепляются. Уверен и еще что-нибудь всплывет. В любом случае спасибо за предложения. Может быть у кого-то будут еще варианты. Это сообщение отредактировал(а) becks - 18.12.2012, 14:45 |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
Родитель у Edge кто? Если его нет, то я бы сделал им один из узлов. Потому что если все элементы в иерархии сцен-графа находятся на одном (и единственном) уровне, то изменение z-положения одного из них приведет к пересортировке всех узлов. Вариант с QGraphicsItemGroup кстати это же и делает - хоть как-то разделяет узлы в сцене.
Это сообщение отредактировал(а) Amp - 18.12.2012, 21:05 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Ещё можно
1. Рисовать соединения в drawBackground(), а сами соединения сделать прозрачными, но shape() соединения выдаёт его форму, чтобы его можно было выделить. 2. Сделать свой классы, производные от QGraphicsItemGroup и QGraphicsScene и отрабатывать в них нажатия мыши, чтобы выделялись соединения, а не группа. Это сообщение отредактировал(а) math64 - 19.12.2012, 08:49 |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
3. Забить на QGraphicsScene и выводить все самому через QPainter
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |