Ubuntu上Qt之简单图片浏览器

>>功能:

    (1)图片切换浏览,上一张/下一张。

    (2)图片放大、缩小。包括两种机制:鼠标滚轮和按钮放大/缩小。

    (3)图片自动循环播放。点击播放后,其他操作均无效,直至点击暂停。

    (4)在图片被放大/缩小后,点击还原或者切换图片时,自动恢复为默认大小。

>>最终效果:

(1)点击播放按钮:

(2)暂停后,点击下一张:

(3)点击放大(或鼠标滚轮往前滚动):

(4)点击还原:

(5)点击缩小(或鼠标滚轮往后滑动):

(6)点击上一张:

(7)点击旋转:

(8)点击缩小(或鼠标滚轮往后):

(9)点击还原:

>>程序:

mypictureview.h

#ifndef MYPICTUREVIEW_H
#define MYPICTUREVIEW_H

#include <QWidget>
#include <QVector>
#include <QPixmap>
#include <QTimer>
#include <QFileDialog>
#include <QString>
#include <QLabel>
#include <QWheelEvent>

namespace Ui {
class MyPictureView;
}

class MyPictureView : public QWidget
{
    Q_OBJECT

public:
    MyPictureView(QVector<QPixmap *> &pictures);

    ~MyPictureView();

private slots:
    void on_btn_prev_clicked();

    void on_btn_spin_clicked();

    void on_btn_play_stop_clicked();

    void on_btn_orig_clicked();

    void on_btn_next_clicked();

    void on_btn_big_clicked();

    void on_btn_smal_clicked();

    void wheelEvent(QWheelEvent * event);

    void pic_showloop();

private:
    Ui::MyPictureView *ui;
    QVector<QPixmap *>  &pictures_;
    QTimer *timer;
    QPixmap pix;
    QLabel *label;

    void pic_show1();
    void pic_show2();

    bool isPlaying;
    float scale;
    int size;
    int currentIndex;
    int imageAngle;
};

#endif // MYPICTUREVIEW_H

mypictureview.h

mypictureview.cpp

#include "mypictureview.h"
#include "ui_mypictureview.h"

MyPictureView::MyPictureView(QVector<QPixmap *> &pictures)
    : pictures_(pictures),
    ui(new Ui::MyPictureView)
{
    ui->setupUi(this);

    scale = 1;
    currentIndex = 0;     // Current picture index
    size = pictures_.size();
    isPlaying = false;
    imageAngle = 0;

    label = new QLabel;
    ui->scrollArea->setWidget(label);
    ui->scrollArea->setAlignment(Qt::AlignCenter);   //显示位置,对齐方式

    timer = new QTimer;
    timer->setInterval(2 * 1000);   //2s
    connect(timer,SIGNAL(timeout()),this,SLOT(pic_showloop()));

    label->setAlignment(Qt::AlignCenter);

    if(size > 0)
        pic_show1();
}

MyPictureView::~MyPictureView()
{
    delete ui;
}

void MyPictureView::on_btn_prev_clicked()       //上一张
{
    timer->stop();

    scale = 1;
    imageAngle = 0;
    currentIndex--;
    if(currentIndex<0)
        currentIndex=size-1;

    pic_show1();
}

void MyPictureView::on_btn_spin_clicked()       //旋转
{
    imageAngle += 1;
    imageAngle = imageAngle % 4;

    pic_show2();
}

void MyPictureView::on_btn_play_stop_clicked()      //播放、暂停,间隔2s
{
    isPlaying = !isPlaying;

    if(isPlaying)
    {
        ui->btn_play_stop->setText(tr("暂停"));
        timer->start();
        ui->btn_big->setEnabled(false);
        ui->btn_next->setEnabled(false);
        ui->btn_orig->setEnabled(false);
        ui->btn_prev->setEnabled(false);
        ui->btn_smal->setEnabled(false);
        ui->btn_spin->setEnabled(false);
    }
    else
    {
        ui->btn_play_stop->setText(tr("播放"));
        timer->stop();
        ui->btn_big->setEnabled(true);
        ui->btn_next->setEnabled(true);
        ui->btn_orig->setEnabled(true);
        ui->btn_prev->setEnabled(true);
        ui->btn_smal->setEnabled(true);
        ui->btn_spin->setEnabled(true);
    }
}

void MyPictureView::on_btn_orig_clicked()       //还原
{
    timer->stop();
    scale = 1;
    imageAngle = 0;

    pic_show1();
}

void MyPictureView::on_btn_next_clicked()       //下一张
{
    timer->stop();
    scale = 1;
    imageAngle = 0;
    currentIndex++;
    if(currentIndex>size-1)
        currentIndex = 0;

    pic_show1();
}

void MyPictureView::on_btn_big_clicked()        //放大
{
    timer->stop();
    scale = scale*1.25;         //和0.8对应,放大次数和缩小次数点击相同次,会还原到原来的样子

    if(imageAngle != 0)
        pic_show2();
    else
        pic_show1();
}

void MyPictureView::on_btn_smal_clicked()       //缩小
{
    timer->stop();
    scale = scale*0.8;

    if(imageAngle != 0)
        pic_show2();
    else
        pic_show1();
}

void MyPictureView::wheelEvent(QWheelEvent *event)          //滚轮放大或缩小
{
    int num = event->delta();
    if(!isPlaying)
    {
        if(num > 0)
            on_btn_big_clicked();
        else
            on_btn_smal_clicked();
    }
}

void MyPictureView::pic_show1()          //显示图片
{
    pix = (*pictures_[currentIndex]).scaled(640*scale,360*scale,Qt::KeepAspectRatio);

    label->setPixmap(pix);
}

void MyPictureView::pic_show2()     //旋转后的显示
{
    QMatrix leftmatrix;

    leftmatrix.rotate(90*imageAngle);

    pix = (*pictures_[currentIndex]).scaled(640*scale,360*scale,Qt::KeepAspectRatio);
    label->setPixmap(pix.transformed(leftmatrix,Qt::SmoothTransformation));
}

void MyPictureView::pic_showloop()      //循环显示图片
{
    scale = 1;

    currentIndex ++;
    if(currentIndex > size-1)
        currentIndex = 0;
    pic_show1();

}

mypictureview.cpp

main.cpp

#include "mypictureview.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QVector<QPixmap *> pictures;
    pictures.push_back(new QPixmap(":/pictures/1"));
    pictures.push_back(new QPixmap(":/pictures/2"));
    pictures.push_back(new QPixmap(":/pictures/3"));
    pictures.push_back(new QPixmap(":/pictures/4"));
    pictures.push_back(new QPixmap(":/pictures/5"));
    pictures.push_back(new QPixmap(":/pictures/6"));
    pictures.push_back(new QPixmap(":/pictures/7"));
    pictures.push_back(new QPixmap(":/pictures/8"));

    MyPictureView view(pictures);

    // Disable maximize and minimize button
    view.setWindowFlags(view.windowFlags()
                    & ~Qt::WindowMaximizeButtonHint
                    & ~Qt::WindowMinimizeButtonHint);
    view.show();

    return a.exec();
}

main.cpp

资源:

原文地址:https://www.cnblogs.com/ylsm-kb/p/9120934.html

时间: 2024-11-05 11:27:31

Ubuntu上Qt之简单图片浏览器的相关文章

简单图片浏览器

在设置开关灯的时候出了一点小问题,默认UISwitch为on当用if(sender.on)做判断时,第一次点击无效.后来调试默认为on,当改变状态时sender.on返回的是0,再次点击返回的是1.判断一个UISwitch为off可以用!sender.on 用到加载本地目录下的文件 //获取所有描述(通过解析plist文件来创建数组对象,比如传入文件的全路径) NSBundle *bundle = [NSBundle mainBundle]; //获取文件的全路径 NSString *path

C# 系统应用之ListView实现简单图片浏览器

最近有同学问我如何使用ListView加载图片列表,前面在"C#系统应用"中TreeView+ListView+ContextMenuStrip控件实现树状图显示磁盘目录,并在ListView中显示文件的详细信息.这里准备简单介绍下给同学讲述的如何使用ListView+ImageList控件实现简单的图片浏览器知识.        第一步 设计界面框架如下图所示,同时添加ImageList控件(不可见) 注意:设置ListView控件的Anchor属性为Top,Bottom,Right

android脚步---简单图片浏览器改变图像透明度

图片浏览器调用ImageView的setAlpha方法来实现改变图片透明度. main.xml文件如下:三个按钮,两个imageview,,界面定义了两个ImageView,一个是显示局部图片的ImageView,android:scaleType="fitCenter表明图片会保持横纵比缩放,并将缩放后图片放在该imageview中央. <?xml version="1.0" encoding="utf-8"?> <LinearLayo

UI基础篇-iOS中简单图片浏览器的实现

1 // 2 3 // HYViewController.m 4 5 // 01-图片浏览器复习 6 7 // 8 9 // Created by apple on 15-4-10. 10 11 // Copyright (c) 2015年 apple. All rights reserved. 12 13 // 14 15 16 17 #import "HYViewController.h" 18 19 20 21 @interface HYViewController () 22

Ubuntu上qt环境的构建

一.安装QT Library: 1,下载qt安装包(压缩包) 2,从Windows上复制到ubuntu下的指定目录,并解压tar xzvf qt-everywhere-opensource-src-4.8.1.tar.gz 3,安装一个编译qt时要用的东西sudo apt-get install g++ 4,安装以下库文件sudo apt-get install libglib2.0-dev libSM-dev libxrender-dev libfontconfig1-dev libxext-

Android 简单图片浏览器 读取sdcard图片+形成缩略图+Gallery

1.读取SD卡上面的图片信息 //想要的返回值所在的列 String[] projection = { MediaStore.Images.Thumbnails._ID}; //图片信息存储在 android.provider.MediaStore.Images.Thumbnails数据库 //快速查询数据库中的图片对应存放路劲 Cursor cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, pro

Android简单图片浏览器

效果如下:            代码编写如下: Crize_demo\app\src\main\res\layout\activity_main.xml 1 <!--定义一个线性布局--> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 andr

制作简单的图片浏览器

(1)加载图片和浏览图片的布局文件 图片预先放置在这里. 主要的布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fi

自定义Gallery控件实现简单3D图片浏览器

本篇文章主要介绍如何使用自定义的Gallery控件,实现3D效果的图片浏览器的效果. 话不多说,先看效果. 上面是一个自定义的Gallery控件,实现倒影和仿3D的效果,下面是一个图片查看器,点击上面的小图片,可以在下面查看大图片. 下面重点说一下,实现图片查看器的思路. 1.手机中图片路径的获取 首先,先不管图片如何展示,如果我们想实现图片查看器的功能,我们首先需要做的是获取到所有的图片的路径信息,只有这样,我们才能实现对图片的查看. 我们可以使用下面的代码实现 private List<St