我试图通过单击GUI
(类似于Windows Image Viewer)上的按钮来从文件夹加载图像并查看上一张和下一张图像。此文件夹中图像的名称为xxxx_00.jpg
至xxxx_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
函数可以正常工作,所以我没有在这里粘贴它。
答案 0 :(得分:0)
由于我不知道RefreshFilename();
的作用,因此我无法确切地说出原因。
但是,我发现您的代码存在一个重大缺陷,即您每次调用MainWindow::loadimage
时都会创建一个新场景,这会导致内存泄漏。
当您提供更多详细信息时,我将在这里更具体。
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;