12:22 pm
Понадобилось расставить фотки вручную.
(вот для этого: http://www.pomorsu.ru/Departments/tphyslab/honor/fas-19/index.html)
Имеется каталог с фотками. В нём файл со списком фоток (имена файлов).
Программа читает этот список и показывает фотки из этого списка.
Показанные фотки можно свободно перемещать.
После завершения программы список переписывается в новом порядке:
слева направо, сверху вниз.
main.cpp
1 #include <QApplication>
2 #include <QLayout>
3 #include <QDebug>
4 #include <QFileInfo>
5 #include <QDir>
6 #include "imagelist.h"
7
8 int main(int argc, char *argv[])
9 {
10 QApplication app(argc, argv);
11
12 if (argc != 2)
13 {
14 qDebug() << "Usage: " << argv[0] << " file.txt";
15 return 1;
16 }
17
18 QWidget window;
19 window.resize(800, 600);
20
21 QVBoxLayout main_layout;
22 window.setLayout(&main_layout);
23
24 ImageList imglist;
25
26 QFileInfo fi(argv[1]);
27 QDir::setCurrent(fi.path());
28 imglist.readImgList(fi.fileName());
29
30 main_layout.addWidget(&imglist);
31 window.show();
32 app.exec();
33
34 return 0;
35 }
36
imagelist.h
1 #ifndef IMAGELIST_H
2 #define IMAGELIST_H
3
4 #include <QListWidget>
5 #include <QString>
6 #include <QList>
7 #include <QListWidgetItem>
8 #include <QListWidget>
9
10 extern QListWidget *imglistwidget;
11
12 class ImageList : public QListWidget
13 {
14 public:
15 ImageList();
16 ~ImageList();
17 void readImgList(const QString & listname);
18 void writeImgList();
19 void sortImgList();
20
21 protected:
22 QString filelist;
23 QList<QListWidgetItem*> imglist;
24
25 void addImage(const QString & filename);
26 };
27
28 #endif // IMAGELIST_H
imagelist.cpp
1 #include "imagelist.h"
2
3 #include <QFile>
4 #include <QFileInfo>
5 #include <QTextStream>
6 #include <QPoint>
7 #include <QDebug>
8
9 /* Нужно для сортировки */
10 QListWidget *imglistwidget;
11
12 ImageList::ImageList()
13 {
14 setViewMode(QListView::IconMode);
15 setMovement(QListView::Snap);
16 setDragDropMode(QAbstractItemView::DragDrop);
17 setFlow(QListView::LeftToRight);
18
19 setIconSize(QSize(150, 150));
20 setGridSize(QSize(180, 180));
21
22 imglistwidget = this;
23 }
24
25 ImageList::~ImageList()
26 {
27 writeImgList();
28 }
29
30 bool LessThan(QListWidgetItem *a, QListWidgetItem *b)
31 {
32 int ax = imglistwidget->visualItemRect(a).x();
33 int ay = imglistwidget->visualItemRect(a).y();
34 int bx = imglistwidget->visualItemRect(b).x();
35 int by = imglistwidget->visualItemRect(b).y();
36 if (ay != by) return (ay < by);
37 if (ax != bx) return (ax < bx);
38 return false;
39 }
40
41 void ImageList::sortImgList()
42 {
43 qDebug() << "Sorting...";
44 qSort(imglist.begin(), imglist.end(), LessThan);
45 }
46
47 void ImageList::addImage(const QString & filename)
48 {
49 qDebug() << "Loading " << filename;
50 QString thumbname = filename;
51 QFileInfo fi(filename);
52 thumbname.replace("." + fi.completeSuffix(), "_t." + fi.completeSuffix());
53 fi.setFile(thumbname);
54 if (!fi.exists())
55 {
56 qDebug() << "No thumbnail found (looked for" << thumbname <<")";
57 thumbname = filename;
58 }
59
60 QPixmap pixmap(thumbname);
61 QIcon icon(pixmap.scaledToWidth(3*iconSize().width())); // прозапас
62 QListWidgetItem *item = new QListWidgetItem(icon, filename);
63
64 imglist.append(item);
65 addItem(item);
66 }
67
68
69 void ImageList::readImgList(const QString & listname)
70 {
71 filelist = listname;
72 QFile file(filelist);
73 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
74 return;
75
76 QTextStream in(&file);
77 in.setCodec("UTF-8");
78 in.setAutoDetectUnicode(true);
79 while (!in.atEnd())
80 {
81 addImage(in.readLine());
82 }
83 }
84
85 void ImageList::writeImgList()
86 {
87 sortImgList();
88 QFile file(filelist);
89 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
90 return;
91
92 qDebug() << "Writing...";
93
94 QTextStream out(&file);
95 QListWidgetItem *item;
96 Q_FOREACH(item, imglist)
97 {
98 out << item->text() << "\n";
99 qDebug() << item->text();
100 }
101 out.flush();
102 }
103