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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter на QGraphicsView  (Прочитано 10342 раз)
solo700
Гость
« : Январь 23, 2010, 20:14 »

Вопрос в следующем ...  QGraphicsView -> QGraphicsScene ... вывод идет на сцену. Всё нормально работает. Надо рисовать прямоугольную область выделения - ну для зуминга - "увеличить-уменьшить" либо просто зону, для выделения объектов. Пишу обработчик для
void KViewMap::mousePressEvent(QMouseEvent *mouseEvent);
void KViewMap::mouseMoveEvent(QMouseEvent *mouseEvent);
void KViewMap::mouseReleaseEvent(QMouseEvent *mouseEvent);
динамический прямоугольник рисую на сцене - на перемещении мышки изменяются параметры прямоугольника типа
polygonItem->setPolygon(polyNew);   -  всё просто, всё работает. Работает замечательно если 5, 10, 300 объектов на сцене. Если 30000 объектов, область выделения отрисовывается уже с затыками - тормозит, не успевает за мышкой. У меня будет порядка 150000 объектов. Как ускорить ?
Решил рисовать не на сцене а непосредственно на view. На тех же самых обработчиках мышки.
Ну там упростим старый, новый прямоугольник - затирание старого - рисование нового.
Код на перемещении мыши :

Код:
QPainter *paint=new QPainter(this); // здесь объявление было в классе - инициализация по нажатию мыши
paint->setPen(QPen(Qt::black, 2));
paint->drawRect(LastRect);
Код:
или
Код:
QPainter paint;
paint.begin(this);
paint.setPen(QPen(Qt::black, 2));
paint.drawRect(LastRect);
paint.end();
Код:
или
Код:
QPainter paint;
paint.begin(viewport());
paint.setPen(QPen(Qt::black, 2));
paint.drawRect(LastRect);
paint.end();
Код:

Всё это выдает сообщение  "Painter not active". Подскажите пожалуйста что не так ?
Очень интересует как ускорить отрисовку на сцене и почему не рисует на виде ?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Январь 23, 2010, 20:28 »

штатный прямоугольник выделения тормозит при таком кол-ве объектов? Если нет, то яб лучше его использовал, вместо самостоятельного рисования.
Записан

Юра.
solo700
Гость
« Ответ #2 : Январь 23, 2010, 21:39 »

В Qt я новичок ... похоже что то упустил ... чтотакое  "штатный прямоугольник выделения" ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 23, 2010, 21:44 »

Если Вам даже удастся его уговорить (не знаю как) - то все равно рисование НЕ из метода paintEvent - это хороший способ нажить себе кучу проблем. Я бы делал "легально", примерно так

- нужно отрисовать по мышe - вызываю repaint, но перед этим ставлю флаг напр. modeDrawMouse

- в перекрытом paintEvent смотрю - если есть modeDrawMouse, то мне не надо рисовать примитивы, не надо чистить background и.т.п. - надо только рисовать необходимое (часто xor)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Январь 23, 2010, 22:36 »

Цитировать
чтотакое  "штатный прямоугольник выделения"
смотри QGraphicsView::setDragMode(QGraphicsView::RubberBandDrag);

Вообще у тебя несколько проблем в приведённом описании и коде.
1) как упомянуто Игорем, в Qt рисовать на виджетах можно только в их методе paintEvent (экстра случаи типа overpainting я не рассматриваю)
2) в коде ты всякий раз при нажатии конпки мыша создаёшь рисовальщик (QPainter), но никогда его не удаляешь - память утекает.
3) Пока существует рисовальщик связанный с этим виджетом, другой рисовальщик работать не может, отсюда сообщение "Painter not active"
4) с терминологией всё как-то плохо:
Цитировать
QGraphicsView -> QGraphicsScene ... вывод идет на сцену
что значит "вывод идёт на сцену"?

Цитировать
динамический прямоугольник рисую на сцене
тоже не понятно, на сцене рисовать нельзя. Т.к. Сцена - контейнер, примерно как QList, только интелектуальный. Видимо речь идёт о создании элемента (наследника QGraphicsItem)
Записан

Юра.
solo700
Гость
« Ответ #5 : Январь 25, 2010, 01:32 »

Спасибо за ответы !
QGraphicsView::setDragMode(QGraphicsView::RubberBandDrag); не помог - работает ещё медленнее, чем мой первый вариант.
Вообщем то я подозревал, что QPainter надо использовать в методе paintEvent. Попробую реализовать предложение Игоря.
Насчет утечки памяти :
QPainter *paint=new QPainter(this)   -  здесь я сам бы позаботился об очистке.
QPainter paint;  -  у этого объекта область видимости - блок, так что разрушится по выходу.
Насчет терминологии ... согласен ... исправлюсь.  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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