C++ Qt无法保存pixmap
你好,我有一个奇怪的问题要保存pixmap 我的小部件标题C++ Qt无法保存pixmap,c++,qt,qt5,qpixmap,C++,Qt,Qt5,Qpixmap,你好,我有一个奇怪的问题要保存pixmap 我的小部件标题 public: QPixmap *base; //Base Poses QPixmap *Hair; //Hair QPixmap *Composited; //Final Composition bool compisition = false; void Composite(); 我的小部件Cpp 在绘画活动中 base = &pic; Hair = &hairs;
public:
QPixmap *base; //Base Poses
QPixmap *Hair; //Hair
QPixmap *Composited; //Final Composition
bool compisition = false;
void Composite();
我的小部件Cpp
在绘画活动中
base = &pic;
Hair = &hairs;
if(compisition)
{
QPixmap pix(128,192);
QPainter *p = new QPainter(&pix);
p->drawPixmap(0,0,128,192,*base);
p->drawPixmap(0,0,128,192,*Hair);
Composited = &pix;
compisition = false;
}
void AnimPreview::Composite()
{
compisition = true;
this->update();
}
主要形式来源
void MainWindow::on_commandLinkButton_clicked()
{
QString file = QFileDialog::getSaveFileName(this,
tr("Save Sprite file"),
"",tr("File PNG (*.png)"));
const QPixmap *pix = ui->SpriteFront->pixmap();
if(!file.isEmpty())
{
QFile files(file);
files.open(QIODevice::WriteOnly);
ui->SpriteFront->Composite();
ui->SpriteFront->Composited->save(&files,"PNG");
}
}
当我试图保存一个文件时,这个过程会工作,但不会出错
未处理的win32异常
更多信息
完整的代码在这里
我避免了检查可能产生错误的地方,因为问题有很多可能的来源,其中包括:
- 您不必创建
指针,因为最终您需要将其从内存中删除QPixmap
- 对于
也会发生同样的情况,因为它只需要是一个局部变量,而且绘制不会立即完成,为了确保绘制完成,您必须调用它的QPainter
方法end()
是一种受保护的方法,因此从设计上讲,我们希望它保持这种状态paintEvent
- 无需使用
来保存图像,您可以直接将文件名传递给它QFile
#ifndef ANIMPREVIEW_H
#define ANIMPREVIEW_H
#include <QLabel>
#include <QPixmap>
class AnimPreview : public QLabel
{
public:
AnimPreview(QWidget *parent = 0);
void Rotate(int value);
void Composite();
void Create(int _sex, int _hair);
QPixmap Composited;
private:
int sex = 0;
int hair = 0;
bool draw = true;
int rotation = 0;
const int offsetX = 16;
const int offsetY = 32;
QPixmap base;
QPixmap Hair;
bool compisition = false;
protected:
void paintEvent(QPaintEvent *);
};
#endif // ANIMPREVIEW_H
在
paintEvent
中执行除绘制以外的任何操作都是UX错误。当设置了sex
或hairs
时,可以按需加载PIXMAP,并且可以在工作线程上异步加载它们,以免阻塞gui。然后,一旦图片可用,工作人员就会发出信号,将其设置在小部件上,因此小部件将更新,并最终绘制所有准备就绪的内容。还请注意,对于默认后端,QImage
到QPixmap
的往返非常便宜,因为pixmap只是内部QImage
@KubaOber的一个薄薄的包装。您完全正确,我看到了其他错误,而不是应用程序的设计。稍后我会更新它。谢谢。您好@eyllanesc,您的代码工作正常。但是pixmap不会被保存。屏幕1°,屏幕2°,图像为空。为什么?
#include "animpreview.h"
#include <QPainter>
AnimPreview::AnimPreview(QWidget *parent):QLabel(parent)
{
}
void AnimPreview::paintEvent(QPaintEvent *){
QPainter p(this);
QPixmap pic;
QPixmap hairs;
if(draw)
{
//Sesso
switch(sex)
{
case 0:
pic.load(":/Male/Base/Res/man_f.png");
break;
case 1:
pic.load(":/Male/Base/Res/woman_f.png");
break;
}
//capelli
if(sex == 1)
{
switch(hair)
{
case 1:
hairs.load(":/Female/Hair/Res/7_aqua.png");
break;
case 2:
hairs.load(":/Female/Hair/Res/5_gold.png");
break;
}
}
if(sex == 0)
{
switch (hair)
{
case 0:
break;
case 1:
hairs.load(":/Male/Hair/Res/1_aqua.png");
break;
case 2:
hairs.load(":/Male/Hair/Res/14_black.png");
break;
}
}
}
p.drawPixmap(width()/2 - offsetX,height()/2 - offsetY,pic,0,rotation,32,48);
p.drawPixmap(width()/2 - offsetX,height()/2 - offsetY,hairs,0,rotation,32,48);
p.drawRect(0,0, width()-1, height()-1);
base = pic;
Hair = hairs;
if(compisition)
{
QPixmap pix(128,192);
QPainter p(&pix);
p.drawPixmap(0,0,128,192, base);
p.drawPixmap(0,0,128,192, Hair);
p.end();
Composited = pix;
compisition = false;
}
}
void AnimPreview::Rotate(int value)
{
rotation = value;
update();
}
void AnimPreview::Create(int _sex, int _hair)
{
sex = _sex;
hair = _hair;
draw = true;
}
void AnimPreview::Composite()
{
compisition = true;
update();
}
void MainWindow::on_commandLinkButton_clicked()
{
QString file = QFileDialog::getSaveFileName(this,
tr("Save Sprite file"),
"",tr("File PNG (*.png)"));
if(!file.isEmpty())
{
ui->SpriteFront->Composite();
ui->SpriteFront->Composited.save(file,"PNG");
}
}