Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ тормоза QGraphicsView

Автор: Tigr 11.11.2010, 9:20

Имеются моменты, когда рисунок сцены меняется 3-4 раза в секунду. Однако наблюдаются конкретные тормоза. Это как-нибудь можно преодолеть?

Автор: Алексей1153 11.11.2010, 9:29

а код то покажи, как ты это делаешь

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

Автор: Tigr 11.11.2010, 9:37

Цитата(Алексей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 11.11.2010, 9:44

Заметил одну фишку: прорисовка происходит, когда мышь остановится. если бесконечно двигать, то прорисовки нет. Отсюда тормоза! Таким образом, задача свелась к тому, как заставить рисовать во время движения мыши?

Автор: Алексей1153 11.11.2010, 9:46

а где именно "3-4 раза в секунду" происходит ?

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

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

Автор: Tigr 11.11.2010, 11:45

Тема с таймером хорошая. Однако, мне покоя не дает: почему событие mouseMoveEvent происходит только после полной остановки мыши?

Автор: Алексей1153 11.11.2010, 12:16

возможно, отключен трекинг. Попробуй включить
setMouseTracking()

Отстальных условий работы твоей программы знать не могу :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)