QPixmap загружает много изображений в Qt - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь загрузить изображения из папки и просмотреть предыдущие и следующие изображения, нажав кнопку на GUI (аналогично Windows Image Viewer).Имена изображений в этой папке: от xxxx_00.jpg до xxxx_99.jpg, поэтому я использую index++ и index-- для изменения имени файла при нажатии кнопок.

Мои коды хорошо работают для отображения первогоизображение, но когда я нажимаю кнопку для просмотра предыдущего или следующего изображения, на нем всегда отображается

QPixmap :: scaled: 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 голосов
/ 12 сентября 2018

Причина

Поскольку я не знаю, что делает RefreshFilename();, я не могу точно сказать, в чем причина.

Однако я вижу серьезный недостаток в вашем коде, то есть вы создаете новую сцену каждый раз, когда вызывается MainWindow::loadimage, и это вызывает утечку памяти.

Когда вы предоставите более подробную информацию, я буду более конкретен здесь.

Решение

  • Установите сцену один раз и добавьте к ней QGraphicsPixmapItem , затем в loadImage обновите растровое изображение элемента.
  • Сохранить текущий номер в атрибуте класса.

Опять же, я буду более конкретен, когда будут добавлены детали.

Пример

В любом случае (в ожидании предоставления 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_imgNum, m_item и loadImage объявлены в заголовке как:

private:
    inline void loadImage();

    int m_imgNum;
    QGraphicsPixmapItem *m_item;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...