Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: kamre от Январь 15, 2009, 18:09



Название: Тормоза QGraphicsView при ScrollHandDrag mode.
Отправлено: kamre от Январь 15, 2009, 18:09
Пытаюсь понять, как можно сделать перетаскивание сцены с помощью мышки. Пока даже в таком простейшем примере получаются тормоза (особенно после разворачивания окна на весь экран):
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
 
int main(int argc, char *argv[]) {
 QApplication app(argc, argv);
 QGraphicsScene *scene = new QGraphicsScene();
 QPen pen(Qt::black, 2.0);
 scene->addRect(0, 0, 400, 300, pen);
 scene->addEllipse(10, 10, 380, 280, pen);
 scene->addLine(0, 0, 400, 300, pen);
 scene->addLine(400, 0, 0, 300, pen);
 QGraphicsView *view = new QGraphicsView();
 view->setDragMode(QGraphicsView::ScrollHandDrag);
 view->setRenderHint(QPainter::Antialiasing, true);
 view->setSceneRect(-1000, -1000, 2000, 2000);
 view->setScene(scene);                                
 view->scale(3, 3);
 view->show();
 return app.exec();
}
 

Что я делаю не так?
Кстати, точно такая же проблема у меня получается если в примере 40000 chips выставить режим ScrollHandDrag.


Название: Re: Тормоза QGraphicsView при ScrollHandDrag mode.
Отправлено: Khs от Январь 15, 2009, 19:50
Цитировать
Пытаюсь понять, как можно сделать перетаскивание сцены с помощью мышки

На самом деле происходит не перетаскивание сцены, а прокрутка представления относительно позиции зажатого курсора, если можно так сказать.

Цитировать
Пока даже в таком простейшем примере получаются тормоза (особенно после разворачивания окна на весь экран)

У меня этот код работает, не вижу никаких тормозов, все что требуется от
view->setDragMode(QGraphicsView::ScrollHandDrag);, выполняется.

Возможно я чего-то неправильно понял.


Название: Re: Тормоза QGraphicsView при ScrollHandDrag mode.
Отправлено: kamre от Январь 15, 2009, 20:17
Цитировать
Пока даже в таком простейшем примере получаются тормоза (особенно после разворачивания окна на весь экран)
У меня этот код работает, не вижу никаких тормозов, все что требуется от
view->setDragMode(QGraphicsView::ScrollHandDrag);, выполняется.
Возможно я чего-то неправильно понял.
Хм.. Похоже, что зависит от видеокарты и/или драйверов. Попробовал на ноутбуке со встроенным видео и работает в общем-то нормально. А вот на компе с NVIDIA 7600GS и 181.20_geforce_winxp_32bit_english_whql почему-то тормозит... Причем как-то странно тормозит, в основном только когда по диагонали тянуть...

Похоже оно все-таки пытается какой-то скроллинг системный задействовать, т.к. судя по показаниям Process Explorer время процессора в системных вызовах практически все тратится...

Еще обнаружил, что установка флага setViewportUpdateMode(QGraphicsView::FullViewportUpdate) решает проблему, т.к. в этом случае перерисовывается все внутри QGraphicsView.. Как-то не оптимально получается...


Название: Re: Тормоза QGraphicsView при ScrollHandDrag mode.
Отправлено: BaltikS от Январь 15, 2009, 21:29
Подобная проблема уже обсуждалась, но решена не была. Полагаю, что дело в кривых драйверах или кривой реализации....