Como mapear um arquivo de recurso em Qt?
-
05-07-2019 - |
Pergunta
É possível mapear um arquivo de recurso em Qt?
Por exemplo:
QFile file(resource_name);
file.open(QIODevice::ReadOnly);
uchar* ptr = file.map(0, file.size());
Quando eu tento isso, ptr == 0 , indicando um erro.
Ele funciona muito bem se eu tentar mapear um arquivo regular.
Estou executando o Qt no Linux, que suporta QFile::Map
.
Solução
Sim, é possível. Há uma coisa para manter em mente. Por padrão, o recurso qt compilador RCC compressas dos recursos.
A chamada file.size () irá retornar o tamanho real, comprimido-un do arquivo original. No entanto, o recurso incorporado é comprimido e é mais provável um tamanho diferente. O file.map (0, file.size ()) devolve um erro, uma vez que o tamanho passado para mapear () é maior do que o recurso a ser mapeada. Mesmo se você passar o tamanho correto para mapear (), ou um tamanho menor, a memória irá conter os dados compactados, não os dados comprimido-un.
A solução é não comprimir o recurso incorporado. Isso pode ser feito através da adição de:
QMAKE_RESOURCE_FLAGS += -no-compress
para o arquivo de projeto qt. Consulte aqui para explicação do QMAKE_RESOURCE_FLAGS.