Игорь Пашев -

Jul. 11th, 2009

12:22 pm

Previous Entry Add to Memories Tell A Friend Next Entry

Понадобилось расставить фотки вручную.
(вот для этого: 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

Tags: , ,
(Оставить комментарий)