简易图片查看器

首先先建一个工程

 然后进入ui界面,拖动出来一个界面

 给他们分别取一些名字 比如 preBtn nextBtn deleteBtn addBtn fileBtn picturelabel


首先第一个按钮:打开文件

编写槽函数

要求点击之后进入标准文件对话框,所以引入头文件

#include <QFileDialog>

槽函数

void Widget::on_fileBtn_clicked()
{
    //打开的文件对话框设置,分别是对话框标题栏,默认目录,筛选器
    fileNames = QFileDialog::getOpenFileNames(this,"选择图片","F:/芒果/2018名师学习资料合集/Mango天台少女/ttsn018.jpg","所有文件(*);;图片文件(*.jpg *.png *.ico)");
    //当选择打开的图片数为0时(没有选择打开图片),提示massagebox 请选择图片
    if(fileNames.count() == 0)
    {
        QMessageBox::information(this,"选择异常","请选择图片");
        return ;
    }
    //在label中显示刚选择的图片的第一张
    showpic();

}

这其中要调用到显示图片到label上的函数,所以实现一下这个函数

void Widget::showpic()
{
    index = 0;
    //声明一个图片的对象 即为刚刚选择的照片
    QPixmap pic(fileNames[index]);
    //显示该图片(fileNames[index]) 第index张图片
    ui->pictureLabel->setPixmap(pic);

    //下面对label大小的修改
    int labelWidth = this->width() - ui->addBtn->width() - 20;
    int labelHight = this->height() - ui->addBtn->height() - 20;
    int picWidtd = pic.width();
    int picHeight = pic.height();

    double widthScale = picWidtd * 1.0 / labelWidth;
    double hightScale = picHeight * 1.0 / labelHight;

    if(widthScale <= 1 && hightScale <= 1)
    {
        ui->pictureLabel->resize(picWidtd, picHeight);
    }
    else
    {
        if(widthScale > hightScale)
        {
            ui->pictureLabel->resize(labelWidth, picHeight / widthScale);
        }
        else
        {
            ui->pictureLabel->resize(picWidtd / hightScale, labelHight);
        }
    }

}

接下来实现 上一张 下一张的按钮

要注意的时当图片已经是第一张/最后一张时的处理

void Widget::on_preBtn_clicked()
{
    //当该图片为第一张图片时,按【上一张】是无效的
    if(index == 0)
    {
        return ;
    }
    //不为第一张图片,则下标减1,filenames向前移动1张,并显示出来
    index--;
    showpic();
}
void Widget::on_nextBtn_clicked()
{
    //当图片为最后一张时,按【下一张】是无效的
    if(index == fileNames.count() - 1 )
    {
        return ;
    }
    //当图片不为最后一张时,filenames向后移动1张,并显示出来
    index++;
    showpic();
}

接下来 添加 按钮:
添加时要注意检测重复的问题

void Widget::on_addBtn_clicked()
{
    //弹出添加文件的对话框
    QStringList names = QFileDialog::getOpenFileNames(this,"选择图片","C:/Users/huxings/Desktop/学习/qt素材","所有文件(*);;图片文件(*.jpg *.png *.ico)");
    if(names.count() == 0)
    {
        QMessageBox::information(this,"选择异常","请选择图片");
        return;
    }
    for (int i = 0;i < names.count();i++)
    {
        //如果不存在该图片,则添加图片至应用
        if(!isExist(names[i]))
        {
            //qDebug()<<names[i];
            fileNames.insert(index,names[i]);
        }
    }
    showpic();
}

图片检测

bool Widget::isExist(QString &name)
{
    for(int i = 0;i < fileNames.count(); i ++)
    {
        //文件名相等时(有相同文件),返回真
        if(fileNames[i] == name)
        {
            return true;
        }
    }
    return false;
}

最后一个按钮,删除

void Widget::on_deletBtn_clicked()
{
    //当最后一张图片被删除后,不能再进行删除操作
    if(index == -1)
    {
        return;
    }
    if(index == fileNames.count() - 1)
    {
       fileNames.removeAt(index);
       index--;
       if(index == -1)
       {
           //最后一张图片被删,则清空label
           index = 0;
           updateBtnState();
           ui->pictureLabel->clear();
           return;
       }
    }
    else
    {
        //删除当前下标的图片
        fileNames.removeAt(index);
    }
    showpic();
}

最后加一个更新按钮的操作,当无法查看上一张/下一张图片时,将enable该按钮

每次showpic()之后调用按钮的刷新函数

void Widget::updateBtnState()
{
    //没有图片文件时,所有的按钮都无法使用
    if(fileNames.count() == 0)
    {
        ui->preBtn->setEnabled(false);
        ui->nextBtn->setEnabled(false);
        ui->deletBtn->setEnabled(false);
    }
    else
    {
        //该图片为第一张时,【上一张】按钮无法使用
        if(index != 0)
        {
            ui->preBtn->setEnabled(true);
        }
        else
        {
            ui->preBtn->setEnabled(false);
        }
        //该图片为最后一张时,【下一张】按钮无法使用
        if(index != fileNames.count() - 1)
        {
            ui->nextBtn->setEnabled(true);
        }
        else
        {
            ui->nextBtn->setEnabled(false);
        }
        ui->deletBtn->setEnabled(true);
    }
}
原文地址:https://www.cnblogs.com/qifeng1024/p/12829210.html