Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: тормоза QGraphicsView
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
Tigr
Имеются моменты, когда рисунок сцены меняется 3-4 раза в секунду. Однако наблюдаются конкретные тормоза. Это как-нибудь можно преодолеть?
Алексей1153
а код то покажи, как ты это делаешь

про какой рисунок речь - какое-то изображение или вся сцена ?
Tigr
Цитата(Алексей1153 @ 11.11.2010, 9:29) *
а код то покажи, как ты это делаешь

про какой рисунок речь - какое-то изображение или вся сцена ?

CODE


void map_panel::mouseMoveEvent(QMouseEvent *event)
{
if ((mode_mouse == MoveMap) )
{
p_map.x=p_map.x-(event->pos().x()-mousePos.x);
p_map.y=p_map.y-(event->pos().y()-mousePos.y);
mousePos.x = event->pos().x();
mousePos.y = event->pos().y();
draw_map(zoom,&p_map);//функция прорисовки
};
}


bool map_panel::draw_map(unsigned int zoom,PointCoordMap* p)
{
this->scene()->clear();
x1=this->width();
y1=this->height();
this->setSceneRect(p->x,p->y,p->x+x1,p->y+y1);
this->centerOn(p->x+x1/2,p->y+y1/2);
...
QPixmap pieceImage;
file_list.resize(mtom_n->size_f);
fp=fopen(mtom_n->FileName.toAscii(),"r+b");
fseek(fp,mtom_n->addr-1,SEEK_SET);
fread(file_list.data(),mtom_n->size_f,1,fp);
pieceImage.loadFromData(file_list);
QGraphicsPixmapItem* item = this->scene()->addPixmap(pieceImage);
item->setPos(i*256, j*256);
fclose(fp);
...
Tigr
Заметил одну фишку: прорисовка происходит, когда мышь остановится. если бесконечно двигать, то прорисовки нет. Отсюда тормоза! Таким образом, задача свелась к тому, как заставить рисовать во время движения мыши?
Алексей1153
а где именно "3-4 раза в секунду" происходит ?

Ну, по крайней мере, в mouseMoveEvent так делать нельзя. Сообщений движения мыши генерируется очень много, а для глаза так часто перерисовывать нет смысла. Зато для процессора это нагрузка - вот и тормоза.

Навскидку (если, конечно, у QGraphicsView нет специальных методов - я им не пользовался, не знаю) можно сделать следующее:
1) завести флажок
bool m_bNeedRedraw;
который устанавливать по любому сообщению движения мыши в режиме MoveMap
2) по таймеру в 50...150 мс проверять состояние флажка и перерисовывать сцену, если надо
Tigr
Тема с таймером хорошая. Однако, мне покоя не дает: почему событие mouseMoveEvent происходит только после полной остановки мыши?
Алексей1153
возможно, отключен трекинг. Попробуй включить
setMouseTracking()

Отстальных условий работы твоей программы знать не могу :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.