Come mappare un file di risorse in Qt?
-
05-07-2019 - |
Domanda
È possibile mappare un file di risorse in Qt?
Ad esempio:
QFile file(resource_name);
file.open(QIODevice::ReadOnly);
uchar* ptr = file.map(0, file.size());
Quando provo questo, ptr == 0 , che indica un errore.
Funziona bene se provo a mappare un file normale.
Sto eseguendo Qt su Linux, che supporta QFile :: Map
.
Soluzione
Sì, è possibile. C'è una cosa da tenere a mente però. Per impostazione predefinita, il compilatore di risorse qt rcc comprime le risorse.
La chiamata a file.size () restituirà la dimensione effettiva, non compressa del file originale. Tuttavia, la risorsa incorporata è compressa ed è molto probabilmente di dimensioni diverse. File.map (0, file.size ()) restituisce un errore poiché la dimensione passata a map () è maggiore della risorsa mappata. Anche se si passa la dimensione corretta a map () o una dimensione inferiore, la memoria conterrà i dati compressi, non i dati non compressi.
La soluzione è non comprimere la risorsa incorporata. Ciò può essere ottenuto aggiungendo:
QMAKE_RESOURCE_FLAGS += -no-compress
al tuo file di progetto qt. Vedi qui per la spiegazione di QMAKE_RESOURCE_FLAGS.