Chibi-nah::blog

Des geekeries, de la MAO, de tout et de rien…

Archives

Wallpaper Finer

Wallpaper finer est un petit logiciel libre et open source (GPLv2), permettant de redimensionner et recadrer très facilement et rapidement une image. Son principal défaut ? Il utilise encore Qt 4.

Comment modifier le code de ce logiciel pour utiliser Qt5 ? Réponse dans cet article.

TL;DR (trop long, flemme de tout lire) : le code source du portage vers Qt5 est disponible ici :

https://lab.shelter.moe/nah/wallpaperfiner

Compilation :

mkdir build
cd build
qmake ../WallpaperFiner.pro
make

Vérification que ça utilise bien qt5 :

ldd wallpaperfiner

Exécution :

./wallpaperfiner

Introduction

Tout est parti d'un pouët de @TritTriton1, qui parlait d'un petit logiciel permettant de recadrer et redimensionner une image facilement. Son seul reproche, c'est que c'est en Qt42. Cela impose donc de garder un framework3 ancien sur sa machine.

L'application (une fois le portage vers Qt5 effectué) en action.

Le code source

Note

Tout a été rédigé avec GNU/Linux, notamment Debian, en tête. Rien n'a été testé sous Windows, aucune aide ni support ne sera apporté de ma part pour ce système d'exploitation.

Note

Ici, j'ai utilisé Qt Creator pour des raisons pratiques4. J'aurais pu utiliser geany, vscode, vim, emacs ou autre éditeur de texte.

Le code source de Wallpaper Finer est disponible sur le site du développeur, Péter Deák5, et est sous licence GPL v2. La dernière version date du mois d'août 20126.

Le projet s'ouvre sans souci avec Qt Creator7. Le projet étant créé avec Qt4, il faut modifier la configuration pour utiliser la bonne version de Qt. Lors de la rédaction de l'article, on en était à la version 5.15.28.

Lors de l'ouverture du projet, Qt Creator demande de le configurer, notamment la cible, ici Desktop (Qt5).

Il faut quand même vérifier si c'est bien la bonne version de Qt qui est sélectionnée, pour éviter toute surprise si jamais on a plusieurs versions du framework9.

Liste des kits de développement (SDK) paramétrés. Ayant fait du ménage dedans, il n'y a plus que Desktop (Qt5).

Versions de Qt installées. Version 4.8.7 (Qt4) et version 5.15.2 (Qt5).

Tout est bon ? On peut continuer.

Cliquer sur le bouton "Configure project".

Au bout de quelques instants, le projet s'affiche sous Projets, en haut à gauche.

Par défaut, tous les nœuds de l'arborescence sont repliés.

Adaptations à faire

Projet

Il y a quelques modifications à faire dans WallpaperFiner.pro.

Ajouter widgets à droite, sur la ligne QT :

QT       += core gui widgets

Pour la traduction en français, ajouter wpfiner_fr.ts à droite, sur la ligne TRANSLATIONS :

TRANSLATIONS = wpfiner_hu.ts wpfiner_pl.ts wpfiner_fr.ts

Modifications effectuées dans WallpaperFiner.pro.

Enregistrer et fermer le fichier.

Traduction fr

On va tout de suite ajouter la traduction en français.

  • Ouvrir le nœud Other files.
  • Dupliquer le fichier wpfiner_pl.ts.
  • Nommer le fichier wpfiner_fr.ts.

Duplication du fichier pour la traduction.

Nommage du fichier.

Ouvrir le fichier wpfiner_fr.ts en double-cliquant dessus. On va faire une modification dans ce fichier xml.

Dans TS, changer la langue de pl_PL à fr_FR, pour language et sourceLanguage.

<TS version="2.0" language="fr_FR" sourcelanguage="fr_FR">

Modifications effectuées.

Enregistrer et fermer le fichier.

Ouvrir maintenant le fichier wpfiner_fr.ts avec Qt Linguist (l'outil dédié pour la traduction).

Note

On peut aussi éditer le fichier xml à la main. Mais ce n'est pas forcément pratique et c'est source d'erreurs.

Menu contextuel -> Ouvrir avec

Qt Linguist. Comparé à un outil léger comme PoEdit, l'interface semble compliquée.

Faire la traduction des différents textes et messages. Je ne m'attarderai pas dessus, ce n'est pas très difficile.

Traduction française terminée.

Cliquer sur le menu Fichier -> Publier pour générer le fichier wpfiner_fr.qm. On en aura besoin par la suite.

Menu Fichier -> Publier.

Fermer Qt Linguist.

Dans Qt Creator, ouvrir le nœud Resources, wpfiner.qrc, /

Faire un clic droit sur / -> Ajouter des fichiers existants…

Menu contextuel -> Ajouter des fichiers existants…

Sélectionner le fichier wpfiner_fr.qm et cliquer sur Ouvrir.

Boîte de dialogue de sélection de fichiers.

Entête (wpfiner.h)

Ouvrir le fichier wpfiner.h.

Modifier le numéro de version en 0.95 (la version étant 0.94).

#define VERSION "0.95"

Dans ce fichier, il y a une erreur (indiquée en rouge) :

  • expected class name.

Pour corriger cette erreur, il faut ajouter des #includes supplémentaires.

Note

S'aider de la documentation du SDK Qt, notamment les pages de migration Qt4 vers Qt5.

Les entêtes à ajouter sous #include <QtCore> sont :

#include <QMainWindow>
#include <QFrame>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QFileDialog>

Modifications effectuées.

Note

il reste un warning (ligne jaune), ne pas en tenir compte pour le moment10

Enregistrer et fermer le fichier wpfiner.h.

C++ (main.cpp)

Ouvrir le fichier main.cpp.

Il y a deux erreurs dans ce fichier :

  • QtGui/QApplication: No such file or directory ;
  • variable has incomplete type 'QApplication'.

Pour corriger ces erreurs, il faut également modifier les includes.

Supprimer cet include :

#include <QtGui/QApplication>

Cet include n'existe plus dans Qt5.

Ajouter les deux includes suivants :

#include <QtWidgets>
#include <QMainWindow>

Profiton-en pour ajouter la traduction française dans la liste des traductions.

Modifier la ligne #define INSTALLED_LANGNUM en remplaçant la valeur 3 par 4

#define INSTALLED_LANGNUM  4

Modifier la liste des langues en remplaçant également [3] par [4], et en ajoutant une ligne supplémentaire référençant la langue française.

char langs[INSTALLED_LANGNUM][4][30] = {
    {"English"  ,"en",""},
    {"French"   ,"fr",":/wpfiner_fr.qm"},
    {"Hungarian","hu",":/wpfiner_hu.qm"},
    {"Polish"   ,"pl",":/wpfiner_pl.qm"}
};

Modifications effectuées.

Enregistrer et fermer le fichier main.cpp.

Note

Comme je ne tiens pas compte de la version Windows11, tout le code défini dans #ifdef Q_WS_WIN n'a pas été modifié. Il y a de fortes chances pour que la traduction française ne fonctionne pas sous Windows. Il faudra modifier le code en conséquence.

C++ (wpfiner.cpp)

Ouvrir le fichier wpfiner.cpp.

Quatre erreurs sont présentes ici (en fait, il n'y en a que deux, les deux autres en découlent) :

  • invalid use of incomplete type class 'QDesktopWidget'
  • class 'QString' has no member named 'toAscii'
  • member access into incomplete type 'QDesktopWidget'
  • no member named 'toAscii' in 'QString'

Pour la première erreur, c'est encore un problème d'include. Remplacer QtGui par QtWidgets.

Supprimer cet include :

#include <QtGui>

Ajouter cet include :

#include <QtWidgets>

Modifications effectuées côté include.

Concernant la seconde erreur, la méthode toAscii() n'existe plus. On va utiliser toLatin1() à la place

Descendre vers la ligne 33912.

Remplacer :

finedImage.save(&finedFile,save_format.toAscii().data());

par :

finedImage.save(&finedFile,save_format.toLatin1().data());

Appel de la méthode corrigée

Enregistrer et fermer le fichier wpfiner.cpp.

Compilation

C'est bon ? On peut compiler le projet.

Pour cela, cliquer sur le petit marteau en bas à gauche, ou passer par le menu Compiler -> Build all projects

Un petit Build devrait apparaître en bas, vers la droite, pour indiquer que le projet est en cours de compilation.

Compilation en cours.

Une fois la compilation terminée, cliquer sur l'onglet Problèmes en bas.

Normalement, si tout a été modifié correctement, il ne devrait pas y avoir d'erreurs en rouge. Juste quelques avertissements (warnings) en jaune, notamment des appels dépréciés qu'il faudrait remplacer.

Liste des problèmes trouvés. Aucune erreur, uniquement des avertissements.

Test

C'est bon ? On peut tester ?

On peut.

Cliquer sur le triangle en bas à gauche (celui du haut, pas celui du bas avec un insecte dessus).

L'application doit se lancer sans problème.

L'application a démarré.

Ouvrir une image ou la glisser-déposer sur la fenêtre, et vérifier le bon fonctionnement du redimensionnement et du recadrage de l'image. Vérifier aussi que l'enregistrement de l'image fonctionne aussi.

Note

Le bouton « Définir comme fond d'écran13 » crée un répertoire WpFiner dans le répertoire $home, enregistre l'image dedans, mais n'effectue pas le changement de fond d'écran. Cela ne fonctionnerait que sous Windows. C'est l'une des limitations de la version GNU/Linux.

Compilation et installation

Pourquoi le titre Compilation ? Pourquoi en plus un changement de niveau de titre alors qu'on vient de compiler et de tester ?

On a compilé via Qt Creator, en Debug. Maintenant, on va compiler en release.

Pourquoi ? Parce que la version de debug, qui se trouve dans ../build-WallpaperFiner-Desktop-Debug pèse 2 Mo, et la version Release ne pèse que dans les 155 ko.

Note

On peut compiler en release avec Qt Creator, en changeant Debug en Release, en bas à gauche. Cependant, la compilation depuis un terminal intéressera plus de personnes, parce que c'est automatisable/plus simple à gérer avec aur/insérer ici une autre raison pour préférer la ligne de commande.

Lancer un terminal. Se déplacer dans le répertoire du projet.

Dans le répertoire du projet, créer un répertoire build, via le terminal ou via un gestionnaire de fichiers.

Création du répertoire build.

Se déplacer dans ce répertoire.

Taper la commande suivante pour générer le fichier Makefile :

qmake ../WallpaperFiner.pro

Création du Makefile.

Pas d'erreur ? Parfait.

Taper simplement make pour compiler l'application. Des lignes vont défiler, c'est normal.

make

Compilation en cours. Les avertissements (warnings) apparaissent à l'écran, c'est normal.

Une fois terminé, vérifier que le fichier wallpaperfiner a bien été généré, et ne fait que 155 ko (environ, tout dépend si c'est compté en ko ou kio).

Ici, c'est bon. Le fichier exécutable (en vert) fait la taille attendue.

On va vérifier que c'est bien Qt5 qui est utilisé, via la commande ldd.

ldd wallpaperfiner

Résultat ?

libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007f0a08314000)
libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f0a07c52000)
libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f0a07707000)

C'est bon, c'est bien Qt5.

On peut lancer l'application et refaire quelques tests, pour confirmer le bon fonctionnement.

./wallpaperfiner

Parfait, aucun problème rencontré.

Pour l'installation, il suffit de copier l'exécutable dans un répertoire défini dans $PATH, comme /usr/local/bin

Par exemple via sudo cp

sudo cp wallpaperfiner /usr/local/bin/

Ici, j'ai utilisé en plus la commande whereis wallpaperfiner pour confirmer que wallpaperfiner est bien reconnu et est situé au bon endroit.

Note

On peut créer une entrée de menu.

Pour cela :

  • soit passer par un éditeur comme alacarte, MenuLibre ou équivalent
  • soit modifier le fichier wallpaperfiner.desktop situé dans le répertoire Desktop, notamment changer les chemins et ajouter la traduction en français de la description, le copier dans /usr/local/share/applications et copier l'icône wpfiner.png dans /usr/local/share/pixmaps/.

Conclusion

Concrètement, le portage vers Qt5 se fait en moins d'une demi-heure, lecture de documentation comprise. C'est relativement simple, sans prise de tête.

Remerciements à @TritTriton pour son pouët montrant cet outil, pour avoir pu compiler la version Qt5 et avoir confirmé son bon fonctionnement.

Modification dimanche 11 juillet 2021.

Le code source est désormais versionné et est disponible sur Shelter : https://lab.shelter.moe/nah/wallpaperfiner --

  1. https://shelter.moe/@TritTriton/106436810381701106
  2. qui date quand même de 2005, et dont la dernière mise à jour date de 2012.
  3. En français, on est censé parler de cadriciel, mais personne ne connait ça sous ce nom
  4. Même si je n'aime pas la disposition de l'environnement de développement intégré (IDE), ni sa traduction inconsistente (c'est à moitié traduit en français).
  5. http://hyperprog.com/wpfiner/index.html
  6. ce qui correspond à Qt 4.8, Qt 5 étant sorti après
  7. Ça peut être utile d'installer Qt5, les outils de développement, etc. Se référer à la documentation ou au gestionnaire de paquets de la distribution utilisée. Idem : je n'apporterai aucune aide sur comment installer et ou configurer le tout.
  8. En tout cas, sous Debian GNU/Linux
  9. Cadriciel. Ce terme est barbant, je vais laisser framework partout dans l'article.
  10. En fait, j'ai carrément ignoré tous les warnings dans le code source, cela concerne des fonctions ou des instructions dépréciées.
  11. Comme indiqué au début de l'article
  12. tout dépend de la présence de sauts de lignes supplémentaires côté code.
  13. To Desktop en anglais