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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [практически решено] определение видимой части QGraphicsScene в QGraphicsView  (Прочитано 16238 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Март 26, 2012, 12:34 »

В папке dannie лежат тестовые файлы. Если открыть big-файл то заметны тормоза, особенно при попытке перемещения графиков по оси Y.
На моей системе (amd phenom II X4 925, CentOS 5.6) абсолютно ничего не тормозит.

Но в любом случае исполльзовать QPainterPath c 16K элементами для простого графика будет очень накладно.
Если включить сглаживание, то даже на моей системе прокрутка вообще не работает - просто полный тормоз - 100% cpu.
Для таких вещей используют QPolygonF и QPainter::drawPolyline() или готовый QGraphicsPolygonItem.
« Последнее редактирование: Март 26, 2012, 12:37 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
_OLEGator_
Гость
« Ответ #16 : Март 26, 2012, 15:04 »

Для определения области рисования поидее можно воспользоваться этим:

Код
C++ (Qt)
void QGraphicsItem::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ) [pure virtual]
QRectF QStyleOptionGraphicsItem::exposedRect

А чтобы график не тормозил при большом количестве данных, то конечно надо отказаться от QPainterPath и производить фильтрацию данных для отрисовки только видимых данных. Если дальше заморачиваться, то при масштабировании надо игнорировать близкие точки (которые попадут на один пиксель) и экспериментальным образом подобрать нужную область, в которой будут все точки совмещаться в одну.
Записан
_Vitaliy_
Гость
« Ответ #17 : Март 26, 2012, 18:29 »

Цитировать
...игнорировать близкие точки...
нельзя потому что графиков будет порядка 20.
В более ранней версии (пробе) рисовал
Код:
 for (int i = 0; i <= size_x-1; i++)
    {
        x.append(my_model->item(i, stolbec)->text().toFloat());
        pointsss.append(QPointF(i,x[i]));
    }

    painter->setPen(QPen(color, 2));
    painter->save();
    painter->drawPoints(pointsss.data(), pointsss.size());
    painter->restore();
непосредственно в Пэинт но тормоза были еще больше...
Попробую уйти от Патча, потом отпишусь.

Все никак не могу понять как узнать значение АбстрактСкролл горизонтальной прокрутки у ГрафикВиева, дабы определить видимую часть при скролле по ОХ, чтобы узнать какую часть переривовывать

П.С. не подскажите где у меня "течет отрисовка" с каждым нажатием на кнопку "открыть график" и закрыть порядка 2Мб утекает...

П.П.С. С Qt начал дружить недавно, поэтому если можно ответ(ы) более развернуто.
Записан
_OLEGator_
Гость
« Ответ #18 : Март 26, 2012, 21:12 »

Игнорировать близкие точки одного графика конечно же!

Значение прокрутки:

Код
C++ (Qt)
QScrollBar * QAbstractScrollArea::horizontalScrollBar () const
int QAbstractSlider::value () const
Записан
_Vitaliy_
Гость
« Ответ #19 : Март 26, 2012, 21:29 »

Цитировать
Игнорировать близкие точки одного графика конечно же!
Нельзя, т.к. графики между собой имеют некоторую зависимость и нужно смотреть на соответствие точек между графиками. Очень важно чтобы точка одного графика была точно под (над) точкой другого.
Завтра на свежую голову попробую код с предложенным скроллом.
А так, спасибо за соучастие.
П.С. случайно нет вариантов, почему память течет?
Записан
_OLEGator_
Гость
« Ответ #20 : Март 26, 2012, 22:06 »

Лично я не вижу, где бы сцену чистил в классе vizual_grifik от уже имеющихся в ней объектов.
Записан
Barmaglodd
Гость
« Ответ #21 : Март 28, 2012, 13:27 »

Цитировать
Отрисовывай только видимую часть атема, и никаких пересчётов не надо.
В QGraphicsItem::paint передаётся прямоугольник, который видим QStyleOptionGraphicsItem::exposedRect.

А как его туда передать?
В конструкторе я рисую путь

Нашел в доках что нужно флаг передать:
Код:
This member is only initialized for items that have the QGraphicsItem::ItemUsesExtendedStyleOption flag set.

у Grafik в конструкторе делаешь setFlag(ItemUsesExtendedStyleOption)
QPainterPath не создаёшь, просто хранишь массив точек.
в void QGraphicsItem::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 )
у option получаешь exposedRect, это видимая область в координатах Graphik, выбираешь все точки из массива, которые попадают в exposedRect и рисуешь по ним QPainterPath, всё! Никаких скроллов и прочей байды GraphicsView всё само за тебя сделает.
Записан
_OLEGator_
Гость
« Ответ #22 : Март 28, 2012, 14:00 »

to Barmaglodd
каждый раз создавать QPainterPath во время отрисовки - весьма накладно и будет тормозить
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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