Автор: norD655 28.2.2008, 15:06
Нужно выводить до 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 28.2.2008, 15:28
Попробуй http://crossplatform.ru/documentation/qtdoc4.3/qpixmapcache.php.
Есть статья: http://crossplatform.ru/?q=node/271
Автор: ViGOur 28.2.2008, 15:31
Вот еще есть статья как этого избежать: http://crossplatform.ru/?q=node/53, смотри Двойная буферизация.
Автор: norD655 28.2.2008, 16:02
Цитата(ViGOur @ 28.2.2008, 15:28)
Попробуй http://crossplatform.ru/documentation/qtdoc4.3/qpixmapcache.php.
Есть статья: http://crossplatform.ru/?q=node/271
Ок. попробую. заметил такую вещь, что зависает в тот момент, когда изменяется геометрия окна или оно двигается. А если запустить и не трогать, то будет нормально выводить картинки.
UPD: виснет, только когда растягиваю, когда двигаю все нормально
Автор: ViGOur 28.2.2008, 16:14
Все правильно, при перерисовке, двойная буферизация должна помочь.
Автор: sploid 29.2.2008, 9:02
norD655, может так попробовать,а не рисовать в паинт ивенте:
picture=new QLabel();
pixmap->loadFromData(pointer,lenght,"JPG");
picture->setPixmap( pixmap );
Автор: norD655 2.3.2008, 16:19
Цитата(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 вроде бы рисует внутреннюю копию переданного объекта, что замедляет процесс=)