Comment mapper un fichier de ressources dans Qt?
-
05-07-2019 - |
Question
Est-il possible de mapper un fichier de ressources dans Qt?
Par exemple:
QFile file(resource_name);
file.open(QIODevice::ReadOnly);
uchar* ptr = file.map(0, file.size());
Lorsque j'essaie, ptr == 0 , ce qui indique une erreur.
Cela fonctionne bien si j'essaie de mapper un fichier normal.
J'utilise Qt sur Linux, qui prend en charge QFile :: Map
.
La solution
Oui, c'est possible. Cependant, il y a une chose à garder à l'esprit. Par défaut, le compilateur de ressources qt rcc compresse les ressources.
L'appel file.size () renverra la taille réelle, non compressée, du fichier d'origine. Toutefois, la ressource incorporée est compressée et a probablement une taille différente. File.map (0, file.size ()) renvoie une erreur car la taille transmise à map () est supérieure à la ressource en cours de mappage. Même si vous transmettez la taille correcte à map (), ou une taille inférieure, la mémoire contiendra les données compressées, pas les données non compressées.
La solution consiste à ne pas compresser la ressource incorporée. Ceci peut être accompli en ajoutant:
QMAKE_RESOURCE_FLAGS += -no-compress
dans votre fichier de projet qt. Voir ici pour une explication de QMAKE_RESOURCE_FLAGS.