L'unico scopo del sistema di risorse Qt è quello di raggruppare i dati all'interno dell'eseguibile stesso. Se si desidera non integrare i dati nell'eseguibile, è sufficiente non utilizzare il sistema di risorse.
su Mac, se si desidera aggiungere "data.txt" dalla sorgente del progetto al vostro pacchetto di applicazioni, ma non per l'eseguibile stesso, aggiungere il seguente al vostro file di .pro
:
mac {
BUNDLE = $$OUT_PWD/$$TARGET$$quote(.app)/Contents
QMAKE_POST_LINK += ditto \"$$PWD/data.txt\" \"$$BUNDLE/Resources/\";
}
ciò premesso file di progetto, utilizzare il QCoreApplication::applicationDirPath()
per un percorso utile a ottenere al file:
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << QCoreApplication::applicationDirPath();
QFile data(QCoreApplication::applicationDirPath() + "/../Resources/data.txt");
if (data.open(QIODevice::ReadOnly | QIODevice::Text))
qDebug() << data.readAll();
return 0;
}
nell'esempio precedente, la cartella Resources
ha nulla a che fare con la risorsa syst Qt em. È semplicemente una convenzione di denominazione nei pacchetti di applicazioni OS X. Non stiamo usando il sistema di risorse Qt qui.
Se si desidera utilizzare il sistema di risorse Qt e accedere direttamente ai dati della risorsa e non tramite uno QFile
, la classe QResource
fornisce l'accesso alle risorse incluse nell'eseguibile.
Se il codice sotto il tuo controllo insiste sull'uso di ifstream
per l'immissione dei dati, è artificialmente limitato e dovrebbe essere corretto. Dovrebbe invece usare istream
, dato che quella classe può essere supportata da qualsiasi cosa, non necessariamente da un file. Se si tratta di codice che non si controlla, è possibile impostare lo ifstream
su un QLocalSocket
.
È possibile mappare la costante QResource::data()
to an input stream tramite un buffer di flusso.
Se la risorsa isCompressed()
, è necessario prima decomprimerlo in un'area temporanea. È anche possibile disable resource compression per evitare il passaggio di decompressione. È possibile utilizzare un compressore eseguibile per intero come upx - al momento dell'esecuzione del codice, tutto sarà già decompresso e pronto per l'uso.
possibile duplicato di [? Come usare un qfile con std :: iostream] (http://stackoverflow.com/questions/5204335/how-to- use-a-qfile-with-stdiostream) – HostileFork
Poiché le risorse Qt sono compresse nell'eseguibile stesso, l'unico modo per farlo funzionare è estrarre il file in una cartella temporanea in modo che il codice non-Qt possa usarlo. – sjdowling
Scrive una funzione o classe che collega il codice Qt e quello non-Qt. Quindi chiama quella funzione (invoca i metodi di quella classe) dal codice non-Qt. –