Ubuntu上Qt之简单图片浏览器

时间:2021-10-10 01:57:00

 >>主要功能:

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

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

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

    (4)图片顺时钟旋转,每次90度。可在放大/缩小状态下旋转,或者相反。

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

 >>最终效果:

(1)点击播放按钮:

Ubuntu上Qt之简单图片浏览器

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

Ubuntu上Qt之简单图片浏览器

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

Ubuntu上Qt之简单图片浏览器

(4)点击还原:

Ubuntu上Qt之简单图片浏览器

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

Ubuntu上Qt之简单图片浏览器

(6)点击上一张:

Ubuntu上Qt之简单图片浏览器

(7)点击旋转:

Ubuntu上Qt之简单图片浏览器

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

Ubuntu上Qt之简单图片浏览器

(9)点击还原:

Ubuntu上Qt之简单图片浏览器

>>添加程序:

  新建Gui工程,名为MyPictureView,类名MyPictureView,基类选择QWidget。

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 = ;
currentIndex = ; // Current picture index
size = pictures_.size();
isPlaying = false;
imageAngle = ; label = new QLabel;
ui->scrollArea->setWidget(label);
ui->scrollArea->setAlignment(Qt::AlignCenter); //显示位置,对齐方式 timer = new QTimer;
timer->setInterval( * ); //2s
connect(timer,SIGNAL(timeout()),this,SLOT(pic_showloop())); label->setAlignment(Qt::AlignCenter); if(size > )
pic_show1();
} MyPictureView::~MyPictureView()
{
delete ui;
} void MyPictureView::on_btn_prev_clicked() //上一张
{
timer->stop(); scale = ;
imageAngle = ;
currentIndex--;
if(currentIndex<)
currentIndex=size-; pic_show1();
} void MyPictureView::on_btn_spin_clicked() //旋转
{
imageAngle += ;
imageAngle = imageAngle % ; 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 = ;
imageAngle = ; pic_show1();
} void MyPictureView::on_btn_next_clicked() //下一张
{
timer->stop();
scale = ;
imageAngle = ;
currentIndex++;
if(currentIndex>size-)
currentIndex = ; pic_show1();
} void MyPictureView::on_btn_big_clicked() //放大
{
timer->stop();
scale = scale*1.25; //和0.8对应,放大次数和缩小次数点击相同次,会还原到原来的样子 if(imageAngle != )
pic_show2();
else
pic_show1();
} void MyPictureView::on_btn_smal_clicked() //缩小
{
timer->stop();
scale = scale*0.8; if(imageAngle != )
pic_show2();
else
pic_show1();
} void MyPictureView::wheelEvent(QWheelEvent *event) //滚轮放大或缩小
{
int num = event->delta();
if(!isPlaying)
{
if(num > )
on_btn_big_clicked();
else
on_btn_smal_clicked();
}
} void MyPictureView::pic_show1() //显示图片
{
pix = (*pictures_[currentIndex]).scaled(*scale,*scale,Qt::KeepAspectRatio); label->setPixmap(pix);
} void MyPictureView::pic_show2() //旋转后的显示
{
QMatrix leftmatrix; leftmatrix.rotate(*imageAngle); pix = (*pictures_[currentIndex]).scaled(*scale,*scale,Qt::KeepAspectRatio);
label->setPixmap(pix.transformed(leftmatrix,Qt::SmoothTransformation));
} void MyPictureView::pic_showloop() //循环显示图片
{
scale = ; currentIndex ++;
if(currentIndex > size-)
currentIndex = ;
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

 添加资源:

(1)资源名随便起一个,我这里起的是pictures,然后我在工程目录下新建了一个文件夹来存放图片资源,取名为picture。

(2)在资源管理器中,先修改一下前缀,可以直接输入一个“/”  。我这里输入的是“/pictures”。

(3)可以选择为每个图片起一个别名,我这里分别用数字1~8代替图片的名字。

Ubuntu上Qt之简单图片浏览器

现在,我们就可以使用QPixmap(":/pictures/1")来加载别名为1的图片。