Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt无法保存pixmap_C++_Qt_Qt5_Qpixmap - Fatal编程技术网

C++ Qt无法保存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;

你好,我有一个奇怪的问题要保存pixmap

我的小部件标题

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
    来保存图像,您可以直接将文件名传递给它

综上所述,我们得出以下结论:

*.h

#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");
    }
}