Есть метод, который возвращает QPixmap
QPixmap getPixmap(){
//...
XRenderComposite (display, PictOpSrc, picture, None, pixmap, 0,0, 0,0, 0,0, width, height);
QPixmap qpxmp = QPixmap::fromX11Pixmap(pixmap);
//...
return qpxmp;
}
Результат сетаю в вижет и хочу отрисовать в качестве фона.
int main(){
//...
QPixmap p = getPixmap();
MyWidget* wdg = new MyWidget;
wdg->show();
wdg->setPixmap(&p);
//...
}
//...
class MyWidget : public QWidget {
Q_OBJECT
private:
QPixmap* image = NULL;
public:
explicit MyWidget(QWidget *parent = 0) : QWidget(parent) {
QTimer::singleShot(0, this, SLOT(run()));
}
~MyWidget(){}
void paintEvent(QPaintEvent* evt){
if (image){
QPainter painter(this);
QRect geo = this->geometry();
painter.drawPixmap(0, 0, image->scaled(geo.size()));
}
}
void setPixmap(QPixmap* image){
this->image = image;
}
};
В таком виде приложение падает на том основании, что у переменной image внутри фигня: валится на isNull методе QPixmap. Пытался использовать QPixmapCache, результат практически тот же. А вот если перед вызовом setPixmap перегнать исходный QPixmap в QByteArray то всё работает, но сама операция QPixmap -> QByteArray -> QImage сильно жрёт процессор.
Я в общих чертах понимаю, почему это происходит, но совершенно не понимаю что с этим можно сделать. Как мне быстро и без оверхеда закешировать QPixmap в MyWidget?