QT图片浏览器制作

7 篇文章 0 订阅
2 篇文章 0 订阅

一、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

在这里没有用到信号,感觉没必要。 

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就可以查看它的帮助文档了!很方便。

补充更新:滑条放大缩小

滑条放大缩小
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));
}

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值