Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тормоза при выводе картинок
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
norD655
Нужно выводить до 4-х картинок одновременно (640х480) на экран. При выводе одной проблем нет, когда пытаюсь отрисовать уже 2 получаю жуткое зависание. Как можно подобную проблему решить?
CODE
picture=new QLabel();
picture2=new QLabel();
pixmap->loadFromData(pointer,lenght,"JPG");
update();

paintEvent(QPaintEvent*)
{
picture->setPixmap(*pixmap);
picture2->setPixmap(*pixmap);
}
ViGOur
Попробуй QPixmapCache.

Есть статья: Optimizing with QPixmapCache
ViGOur
Вот еще есть статья как этого избежать: Быстро и без мерцаний, смотри Двойная буферизация.
norD655
Цитата(ViGOur @ 28.2.2008, 15:28) *
Попробуй QPixmapCache.

Есть статья: Optimizing with QPixmapCache

Ок. попробую. заметил такую вещь, что зависает в тот момент, когда изменяется геометрия окна или оно двигается. А если запустить и не трогать, то будет нормально выводить картинки.
UPD: виснет, только когда растягиваю, когда двигаю все нормально
ViGOur
Все правильно, при перерисовке, двойная буферизация должна помочь. :)
sploid
norD655, может так попробовать,а не рисовать в паинт ивенте:
picture=new QLabel();
pixmap->loadFromData(pointer,lenght,"JPG");
picture->setPixmap( pixmap );
norD655
Цитата(sploid @ 29.2.2008, 9:02) *
norD655, может так попробовать,а не рисовать в паинт ивенте:
picture=new QLabel();
pixmap->loadFromData(pointer,lenght,"JPG");
picture->setPixmap( pixmap );

мне выводить не статичную картинку нужно, она постоянно меняется.
В общем решил проблему. Создал свой класс на базе QLabel и там с помощью пейнтера вывожу картинку=)) без всяких дабл буферов (он внутри пейнтера уже используется):
CODE
//ImageLabel.h
class QPixmap;
class QPaintEvent;
class ImageLabel:public QLabel
{
QPixmap *pixmap;
public:
ImageLabel(QWidget *parent);
void setPixmap(QPixmap* pxmp);
void paintEvent(QPaintEvent *);

};

//ImageLabel.cpp

#include "ImageLabel.h"
ImageLabel::ImageLabel(QWidget *parent):QLabel(parent)
{
pixmap=0;
}
void ImageLabel::setPixmap(QPixmap *pxmp)
{
pixmap=pxmp;
}
void ImageLabel::paintEvent(QPaintEvent *evt)
{
if(pixmap!=0)
{
QPainter mypainter(this);
mypainter.setWindow(this->frameGeometry());
mypainter.drawPixmap(this->frameGeometry(),*pixmap);
}

}


в классе переопределил метод setPixmap, чтобы он принимал не ссылку на объект, а указатель. Кроме того, QLabel вроде бы рисует внутреннюю копию переданного объекта, что замедляет процесс=)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.