Projet C++ avec Qt
Bruno PETIT - Antonin RAFFIN
ENSTA ParisTech 2016
Note: voir README.md/.pdf pour la compilation
Réaliser un lecteur permettant de prendre en charge les différents formats utilisés
pour les bandes dessinés
Intuitif
Interface agréable
Rapide
Orienté vers l'utilisateur:
Note: Les différentes classes sont détaillées par la suite
Book
Archive
MainWindow
Extraction
Gestion du livre
Affichage et interaction avec l'utilisateur
Async
Lazy Loading
Affichage de l'image
ImageGraphicView
class Archive
{
private:
std::string name;
std::string currentEntryName;
unsigned int nbEntries;
unsigned int counter;
void* currentArchive;
void* currentEntry;
public:
Archive(){}
virtual ~Archive(){}
virtual void open(){}
virtual void close(){}
virtual bool hasNext(){}
virtual void next(){}
virtual std::string getEntryName(){}
virtual int getCurrentEntryNb(){}
virtual int getNbOfEntries(){}
virtual void writeTempEntry(std::string tempFolder){}
}
Classe abstraite pour représenter et extraire une archive
archive = new LibArchive(archiveName); //Classe héritant de la classe Archive
while (archive->hasNext())
{
archive->next();
archive->writeTempEntry(tempFolder);//Extraction de l'entité courante
}
archive->close();
Exemple: extraire toute une archive
Archive
LibArchive
LibZippp
Chaque classe qui utilise une certaine bibliothèque pour extraire les archives hérite de la classe Archive
Bibliothèque:
class Book
{
public:
Book(){}
Book(std::string archiveName);
Book(std::string archiveName, std::string tempFolderName);
~Book();
void extractOneImage();
void extractAll();
void createImagesList();
unsigned int getNbPages();
int getCurrentPageNumber();
QImage getCurrentImage();
QImage getNextImage();
void setPage(unsigned int pageNumber);
bool hasPrev();
bool hasNext();
void prev();
void next();
private:
void init(std::string archiveName);
void createTempFolder();
std::string tempFolder;
LibArchive* bookArchive;
QStringList images;
unsigned int currentPage;//Warning: page numbers go from 0 to nbPages-1
unsigned int nbPages;
};
Classe pour représenter et manipuler un livre
Surcouche pour faire le lien entre l'extracteur (de type Archive) et l'interface graphique (MainWindow)
Permet de parcourir le dossier temporaire dans lequel ont été extraites les images
Book
Archive
MainWindow
Extraction
Gestion du livre
Affichage et interaction avec l'utilisateur
class Async : public QObject
{
Q_OBJECT
public:
Async();
Async(Book* comicBook);
~Async();
void beginExtraction();
void continueExtraction();
void setCurrentBook(Book* comicBook);
int getNbPagesLoaded();
signals:
void imageReady(int pageNumber);
private:
int nbPagesLoaded;// number of pages extracted
int nbPages;// Total number of pages (of the book)
int nextStop;// Used in the async extraction for stopping the loop
int nbPagesToExtractBeforeDipslay;// Nb of pages to be load before showing
Book* currentBook;// The current comic book we are extracting
};
Classe pour extraire l'archive de manière asynchrone
Se place entre la classe Book et l'interface graphique (MainWindow)
Book
Archive
MainWindow
Extraction
Gestion du livre
Affichage et interaction avec l'utilisateur
Lazy loading: extrait une image que lorsqu'elle doit être affichée
=> Le dossier temporaire a une taille minimale
Async
Permet un affichage rapide (émet un signal dès que les deux premières images sont prêtes)
Lazy Loading
class ImageGraphicView : public QGraphicsView
{
Q_OBJECT
public:
ImageGraphicView(QWidget * parent=0);
~ ImageGraphicView();
void setImage(const QImage & image);
public slots:
void fitImage();
protected:
virtual void resizeEvent(QResizeEvent *event);
virtual void wheelEvent(QWheelEvent *event);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
void setZoomFactor(const double factor) { zoomFactor=factor; }
void setZoomCtrlFactor(const double factor) {zoomCtrlFactor=factor; }
double zoomFactor;
double zoomCtrlFactor;
private:
// Scene where the image is drawn
QGraphicsScene* scene;
// Pixmap item containing the image
QGraphicsPixmapItem* pixmapItem;
// Size of the current image
QSize imageSize;
// Current pixmap
QPixmap currentPixmap;
};
Classe pour afficher et manipuler une image
Gère les différents événements:
MainWindow
Affichage et interaction avec l'utilisateur
ImageGraphicView
Affichage de l'image
S'occupe du bon affichage de l'image:
Classe principale pour l'affichage et l'interaction avec l'utilisateur
Interaction
Affichage
Ouvrir un fichier
Navigation
Mode d'affichage
(une ou deux pages)
Réinitialiser le zoom
Icônes => plus universel et intuitif
Crédits: flaticon.com
Un raccourci clavier est associé à chaque icône
Les instructions pour la compilation et les informations sur le logiciel sont dans le README.md