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

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

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ Тормоза при выводе картинок

Автор: 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 вроде бы рисует внутреннюю копию переданного объекта, что замедляет процесс=)

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