QPixmap在Qt中加载许多图像

时间:2018-09-10 21:27:33

标签: c++ qt user-interface

我试图通过单击GUI(类似于Windows Image Viewer)上的按钮来从文件夹加载图像并查看上一张和下一张图像。此文件夹中图像的名称为xxxx_00.jpgxxxx_99.jpg,因此单击按钮时,我使用index++index--来更改文件名。

我的代码可以很好地显示第一张图像,但是当我单击按钮查看上一张或下一张图像时,它始终显示

  

QPixmap :: scaled:Pixmap是一个空的pixmap

并返回一个空图像(第一个图像消失了,但新图像没有显示)。

这是我的代码:

在mainwindow.cpp中

void MainWindow::on_pushButton_4_clicked()   //previous image
{
    if (index < 1)
    {
        index = 99;
        QLabel label;
        label.setText("Go back");
        label.show();
    }
    else
    {
        index--;
    }
    RefreshFilename();
    loadimage();
}

void MainWindow::on_pushButton_5_clicked()   //next image
{
    if (index > 98)
    {
        index = 0;
        QLabel label;
        label.setText("ALL SET");
        label.show();
    }
    else
    {
        index = index + 1;
    }
    RefreshFilename();
    loadimage();
}


void MainWindow::loadimage()
{
   // image.load(filename);
   // im = image.scaled(500,500,Qt::KeepAspectRatio);

    imageObject = new QImage();
    imageObject->load(filename);
    image = QPixmap::fromImage(*imageObject);
    im = image.scaled(400,400,Qt::KeepAspectRatio);
    scene = new QGraphicsScene(this);
    scene->addPixmap(image);
    scene->setSceneRect(image.rect());
    ui->mainimage->setScene(scene);
}

我花了整整2天的时间进行调试,但还是不知道。我期待任何建议和支持!

顺便说一句Refreshfilename函数可以正常工作,所以我没有在这里粘贴它。

1 个答案:

答案 0 :(得分:0)

原因

由于我不知道RefreshFilename();的作用,因此我无法确切地说出原因。

但是,我发现您的代码存在一个重大缺陷,即您每次调用MainWindow::loadimage时都会创建一个新场景,这会导致内存泄漏。

当您提供更多详细信息时,我将在这里更具体。

解决方案

  • 设置场景一次,并向其中添加一个 QGraphicsPixmapItem ,然后在loadImage中更新该项目的像素图。
  • 将当前数字保留在class属性中。

同样,添加详细信息后,我会更加具体。

示例

无论如何(等待您提供MVCE),我已经根据您的任务描述准备了一个工作示例:

#define IMAGE_COUNT 99

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    m_imgNum(0),
    m_item(new QGraphicsPixmapItem())
{
    auto *widget = new QWidget(this);
    auto *layoutMain = new QVBoxLayout(widget);
    auto *layoutButtons = new QHBoxLayout();
    auto *btnPrev = new QPushButton(tr("Previous"), this);
    auto *btnNext = new QPushButton(tr("Next"), this);
    auto *view = new QGraphicsView(this);

    view->setScene(new QGraphicsScene(this));
    view->scene()->addItem(m_item);

    layoutButtons->addStretch();
    layoutButtons->addWidget(btnPrev);
    layoutButtons->addWidget(btnNext);
    layoutButtons->addStretch();

    layoutMain->addWidget(view);
    layoutMain->addLayout(layoutButtons);

    setCentralWidget(widget);
    resize(640, 480);
    loadImage();

    connect(btnPrev, &QPushButton::clicked, [this](){
        if (m_imgNum > 0)
            m_imgNum--;
        else
            m_imgNum = IMAGE_COUNT;

        loadImage();
    });

    connect(btnNext, &QPushButton::clicked, [this](){
        if (m_imgNum < IMAGE_COUNT)
            m_imgNum++;
        else
            m_imgNum = 0;

        loadImage();
    });
}

void MainWindow::loadImage()
{
    m_item->setPixmap(QString("images/image_%1.jpg").arg(m_imgNum, 2, 10, QChar('0')));
}

其中m_imgNumm_itemloadImage在标头中声明为:

private:
    inline void loadImage();

    int m_imgNum;
    QGraphicsPixmapItem *m_item;