тормоза QGraphicsView |
Здравствуйте, гость ( Вход | Регистрация )
тормоза QGraphicsView |
Гость_Tigr_* |
11.11.2010, 9:20
Сообщение
#1
|
Гости |
Имеются моменты, когда рисунок сцены меняется 3-4 раза в секунду. Однако наблюдаются конкретные тормоза. Это как-нибудь можно преодолеть?
|
|
|
Алексей1153 |
11.11.2010, 9:29
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
а код то покажи, как ты это делаешь
про какой рисунок речь - какое-то изображение или вся сцена ? Сообщение отредактировал Алексей1153 - 11.11.2010, 9:30 |
|
|
Гость_Tigr_* |
11.11.2010, 9:37
Сообщение
#3
|
Гости |
а код то покажи, как ты это делаешь про какой рисунок речь - какое-то изображение или вся сцена ? 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
Сообщение
#4
|
Гости |
Заметил одну фишку: прорисовка происходит, когда мышь остановится. если бесконечно двигать, то прорисовки нет. Отсюда тормоза! Таким образом, задача свелась к тому, как заставить рисовать во время движения мыши?
|
|
|
Алексей1153 |
11.11.2010, 9:46
Сообщение
#5
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
а где именно "3-4 раза в секунду" происходит ?
Ну, по крайней мере, в mouseMoveEvent так делать нельзя. Сообщений движения мыши генерируется очень много, а для глаза так часто перерисовывать нет смысла. Зато для процессора это нагрузка - вот и тормоза. Навскидку (если, конечно, у QGraphicsView нет специальных методов - я им не пользовался, не знаю) можно сделать следующее: 1) завести флажок bool m_bNeedRedraw; который устанавливать по любому сообщению движения мыши в режиме MoveMap 2) по таймеру в 50...150 мс проверять состояние флажка и перерисовывать сцену, если надо |
|
|
Гость_Tigr_* |
11.11.2010, 11:45
Сообщение
#6
|
Гости |
Тема с таймером хорошая. Однако, мне покоя не дает: почему событие mouseMoveEvent происходит только после полной остановки мыши?
|
|
|
Алексей1153 |
11.11.2010, 12:16
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
возможно, отключен трекинг. Попробуй включить
setMouseTracking() Отстальных условий работы твоей программы знать не могу |
|
|
Текстовая версия | Сейчас: 27.12.2024, 5:00 |