gpt4 book ai didi

c++ - QPixmap 在 Qt 中加载许 multimap 像

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:48 26 4
gpt4 key购买 nike

我正在尝试从文件夹中加载图像,并通过单击 GUI 上的按钮(类似于 Windows 图像查看器)查看上一张和下一张图像。这个文件夹里面图片的名字是xxxx_00.jpgxxxx_99.jpg,所以我用的是index++index-- 单击按钮时更改文件名。

我的代码可以很好地显示第一张图片,但是当我点击一个按钮查看上一张或下一张图片时,它总是显示

QPixmap::scaled: Pixmap is a null pixmap

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

这是我的代码:

在主窗口.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 函数工作正常,所以我没有将它粘贴在这里。

最佳答案

原因

因为我不知道 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_imgNumm_itemloadImage 在 header 中声明为:

private:
inline void loadImage();

int m_imgNum;
QGraphicsPixmapItem *m_item;

关于c++ - QPixmap 在 Qt 中加载许 multimap 像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52265707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com