1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/*
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version
2 of the License, or (at your option) any later version.
*/
#include <QDesktopWidget>
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QImage>
#include <QWheelEvent>
#include "pictureviewer2.h"
PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0), mCurPos(0), mDefaultFile(":/picgone.png") {
//behave like QDialog, but don't be one...
setWindowFlags(QFlags<Qt::WindowType>(0x1|0x2|0x1000|0x2000|0x10000|0x8000000));
//initial file list
mFiles = QStringList() << mDefaultFile;
//setup gui
mScene = new QGraphicsScene(this);
setScene(mScene);
QDesktopWidget *dw = QApplication::desktop();
QSize screenSize = dw->availableGeometry().size();
mMinimunSize = QSize(screenSize.width() - 100, screenSize.height() - 100);
setMinimumSize(mMinimunSize);
move(50, 50);
setVisible(false);
showFile(mFiles.at(mCurPos));
}
void PictureViewer2::addFiles(const QStringList &files, bool clear){
if(clear){
mFiles.clear();
mFiles = files;
mCurPos = 0;
return;
}
foreach(const QString &f, files){
if(!mFiles.contains(f)){
mFiles.append(f);
}
}
}
void PictureViewer2::setFile(const QString &file){
addFiles(QStringList() << file, true);
showFile(mFiles.at(mCurPos));
}
QSize PictureViewer2::sizeHint() const{
return mMinimunSize;
}
void PictureViewer2::next(){
if(mCurPos + 1 >= mFiles.size()){
return;
}
++mCurPos;
showFile(mFiles.at(mCurPos));
}
void PictureViewer2::previous(){
if(mCurPos - 1 < 0){
return;
}
--mCurPos;
showFile(mFiles.at(mCurPos));
}
void PictureViewer2::wheelEvent(QWheelEvent *event){
int steps = event->delta() / 8 / 15;
if(steps < 0){
next();
}else{
previous();
}
}
void PictureViewer2::showFile(const QString file){
QPixmap pixmap(file);
if(pixmap.isNull()){
return;
}
setCurPalette(pixmap);
if((pixmap.height() > height()) || (pixmap.width() > width())){
pixmap = pixmap.scaled(QSize(width() - 3, height() - 10), Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
if(mCur){
mScene->removeItem(mCur);
mCur = 0;
}
mCur = new QGraphicsPixmapItem(pixmap);
float cX = width() - pixmap.width() / 2;
float cY = height() - pixmap.height() / 2;
mCur->setPos(QPointF(cX, cY));
mScene->addItem(mCur);
}
void PictureViewer2::setCurPalette(const QPixmap &pic){
QPoint val1 = QPoint(qrand() % pic.width(), qrand() % pic.height());
QPoint val2 = QPoint(qrand() % pic.width(), qrand() % pic.height());
QImage img = pic.toImage();
QColor c1(img.pixel(val1));
QColor c2(img.pixel(val2));
QLinearGradient g(QPoint(0,0), QPoint(rect().bottomRight()));
g.setColorAt(0, c1);
g.setColorAt(1, c2);
setBackgroundBrush(QBrush(g));
}
|