一、Win7的自带查看器的效果
二、自己手工制作的效果
1、UI界面
2、效果界面
三、代码实现
1、头文件
2、主代码
(1)全局定义和预加载
(2)列表按钮:tool_button
(3)切换图片
(4)自动播放和停播
(5)放大,缩小,图片旋转
总结:
传送门
1、利用控件实现文件打开,保存,退出功能。
2、将打开的文件路径显示到Widget的列表中。
3、实现图片的切换,旋转,缩放。
4、实现图片的自动播放和停止自动播放。
5、待完成:图片切换效果,图片删除,图片编辑。
6、用到了2个label,1个listWidget,7个push_button,1个tool_button。
7、借用了别人一些代码,我真的很菜。
一、Win7的自带查看器的效果
二、自己手工制作的效果
1、UI界面
2、效果界面
注意:有个bug,缩小放大只能实现一次,不能连续放大和缩小,最后也没想出来。
三、代码实现
1、头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QMenu>
#include<QFileDialog>
#include<QListWidgetItem>
#include<QPixmap>
#include<QTimer>
#include<QImage>
#include<QPainter>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_toolButton_clicked();
void on_toolButton_triggered(QAction *arg1);
void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_pushButton_5_clicked();
void on_pushButton_6_clicked();
void on_pushButton_7_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
在这里没有用到信号,感觉没必要。 文章来源:https://www.toymoban.com/news/detail-497833.html
2、主代码
(1)全局定义和预加载
#include "mainwindow.h"
#include "ui_mainwindow.h"
QImage* img;
QMenu *mu;
QTimer *timer; 计时器
//QPixmap *map; 画布
int a=1; 第几张
int b=6; 总张数
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
文件选项
mu = new QMenu(ui->toolButton);
mu->addAction("打开");
mu->addAction("保存");
mu->addAction("另存为");
mu->addAction("退出");
for (int i=1;i<=b ;i++ ) {
把图片设置到标签列表中
ui->listWidget->addItem("E:/QT/Image/"+QString::number(i)+".jpg"); 转换路径格式
}
图片加载
timer = new QTimer;
img=new QImage; QImage比QPixmap更优化,QImage为图像的像素级访问做了优化.
img->load("E:/QT/Image/"+QString::number(a)+".jpg");
ui->label->setPixmap(QPixmap::fromImage(*img));
ui->label_2->setText("当前为第"+QString::number(a)+"张,"+"共"+QString::number(b)+"张");
}
(2)列表按钮:tool_button
列表按钮
void MainWindow::on_toolButton_clicked()
{
ui->toolButton->setMenu(mu); 打开图片
ui->toolButton->showMenu();
}
void MainWindow::on_toolButton_triggered(QAction *arg1)
{
if(arg1->text()=="打开"){
QString filename = QFileDialog::getOpenFileName(
this,
tr("打开图片"),
"/home",
tr("Images(*.jpg *.jpeg *.png *.bmp )"));
定义一张图片
QPixmap pic(filename);
适应标签
pic = pic.scaled(ui->label->width(),ui->label->height());
把图片设置到标签列表中
ui->listWidget->addItem(filename);
把图片显示在标签中
ui->label->setPixmap(pic);
//ui->label->setText(filename);
}else if(arg1->text()=="保存"){
QScreen *screen = QGuiApplication::primaryScreen();
QString runPath = QCoreApplication::applicationDirPath(); 获取当前文件的编译路径
QString runPath = QFileDialog::getExistingDirectory(this, "choose src
Directory", "E:/QT/Image");
qDebug() << runPath;
screen->grabWindow(ui->label->winId()).save(runPath); 保存在当前文件夹下
}else if(arg1->text()=="另存为"){
QString filename1 = QFileDialog::getSaveFileName(
this,
tr("Save Image"),
"", 选择路径
tr("Images (*.png *.bmp *.jpg *.jpeg)"));
QScreen *screen = QGuiApplication::primaryScreen();
screen->grabWindow(ui->label->winId()).save(filename1);
}else{
exit(0);
}
}
(3)切换图片
上一张
void MainWindow::on_pushButton_clicked()
{
--a;
判断,如果是第一张的上一张,那么就是最后一张
if(a<1) a=b+a;
先停止计时器 最后再开始
timer->stop();
img->load("E:/QT/Image/"+QString::number(a)+".jpg");
显示当前信息
ui->label_2->setText("当前第"+QString::number(a)+"张,"+"共"+QString::number(b)+"张");
label标签显示图片
ui->label->setPixmap(QPixmap::fromImage(*img));
timer->start(5000);
}
下一张
void MainWindow::on_pushButton_2_clicked()
{
++a;
判断如果到了最后一张,那么下一张就是第一张
if(a>b) a=1;
先停止计时器 最后再开始
timer->stop();
img->load("E:/QT/Image/"+QString::number(a)+".jpg");
显示当前信息
ui->label_2->setText("当前为第"+QString::number(a)+"张,"+"共"+QString::number(b)+"张");
label标签显示图片
ui->label->setPixmap(QPixmap::fromImage(*img));
timer->start(4000);
}
(4)自动播放和停播
自动播放
void MainWindow::on_pushButton_3_clicked()
{
先停止计时器 最后再开始
timer->stop();
img->load("E:/QT/Image/"+QString::number(a)+".jpg");
显示当前信息
ui->label_2->setText("当前为第"+QString::number(a)+"张,"+"共"+QString::number(b)+"张");
label标签显示图片
ui->label->setPixmap(QPixmap::fromImage(*img));
判断
++a;
if(a>b) a=1;
timer->start(5000);
}
停止自动播放
void MainWindow::on_pushButton_4_clicked()
{
timer->stop();
}
(5)放大,缩小,图片旋转
放大
QImage* imgScaled; 接收更改后的图片
int width1=0; 声明图片宽
int height1=0; 声明图片高
void MainWindow::on_pushButton_5_clicked()
{
imgScaled = new QImage;
width1 = img->width()+100; 宽加100像素
height1 = img->height()+100; 高加100像素
*imgScaled =img->scaled(width1, 显示宽长,避免关键字重名
height1, 显示高长
Qt::KeepAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(*imgScaled));
}
缩小
void MainWindow::on_pushButton_6_clicked()
{
imgScaled = new QImage;
width1 = img->width()-100;
height1 = img->height()-100;
*imgScaled=img->scaled(width1, 显示宽长
height1, 显示高长
Qt::IgnoreAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(*imgScaled));
}
图片旋转
QMatrix matrix;
void MainWindow::on_pushButton_7_clicked()
{
matrix.rotate(90); 旋转角度
ui->label->setPixmap(QPixmap(QPixmap::fromImage(*img)) 转换格式并显示图片
.transformed(matrix, Qt::SmoothTransformation));
}
总结:
1、还存在一些bug没修复,如:缩放次数为1。
2、还有编辑功能和图片切换风格和打开方式,视频播放等,待实现。
3、还不能播放文件名不连续,后缀不一样的图片。这点需要思考。
4、功能是基本完成了,也是个小作业,做了两天,调用的库是真的难,慢慢找方法,然后我发现把光标放在某类型上,然后按F1就可以查看它的帮助文档了!很方便。
补充更新:滑条放大缩小
文章来源地址https://www.toymoban.com/news/detail-497833.html
滑条放大缩小
void MainWindow::on_verticalSlider_valueChanged(int value)
{
imgScaled = new QImage;
width1 = img->width();
height1 = img->height();
*imgScaled=img->scaled(width1*value/10,
height1*value/10,
Qt::IgnoreAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(*imgScaled));
}
到了这里,关于QT图片浏览器制作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!