简易图片查看器
首先先建一个工程
然后进入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); } }