2014-12-18 15 views
9

Stiamo sviluppando la nostra prima applicazione Qt/QML (tecnologia di prova). Mentre la tecnologia sembra molto promettente a colpo d'occhio, abbiamo affrontato così tanti problemi strani inaspettati che quasi abbandonano all'inizio.QML: come specificare il percorso del file immagine relativo alla cartella dell'applicazione

Ecco uno di questi problemi.

Vogliamo le seguenti cartelle layout per la nostra applicazione:

--> ApplicationFolder 
|--> qml  // QML files (also structured by subfolders) 
|--> resources // Application resources (images, sounds, data-files, etc.) 
| |--> images // Image resources (also structured by subfolders) 
| |--> data  // Different data files 
| |--> ...  // Other resources 
|--> Application.exe // Application executable 
|--> *.dll    // DLLs application depends on 

Il problema è che, al fine di specificare file immagine per Image QML voce dobbiamo usare percorso relativo al file QML ?! Questo è assolutamente folle. Durante lo sviluppo i file a volte si spostano tra le cartelle (si sposta il file QML e si deve correggere tutto il percorso che ha ?!); alcuni file QML diversi devono fare riferimento alla stessa immagine (stessa risorsa immagine ma diverso percorso reale in diversi file QML).

Quindi la domanda è: come specificare il percorso dell'immagine relativo alla cartella dell'applicazione? È possibile a tutti?

Grazie in anticipo!

PS. L'utilizzo del sistema di risorse di Qt (quando le risorse sono incorporate nell'eseguibile) non è un'opzione nel nostro caso. Abbiamo bisogno di risorse non elaborate su disco (compresi i file QML, almeno durante la fase di sviluppo).

PPS. Ho scritto questa domanda dopo aver passato un'intera giornata a risolvere il problema da solo tramite documentazione/google/stackoverflow; nessun successo (la maggior parte degli esempi usa l'incorporamento delle risorse, altri sono troppo semplici e usano solo percorsi relativi).

+0

'Questo è assolutamente folle. Durante lo sviluppo i file a volte si spostano tra le cartelle (si sposta il file QML e si deve correggere tutto il percorso che ha?!); -> Cosa è insano nello sviluppo durante la frase di sviluppo? Ovviamente, se non lo si progetta correttamente, basta fare una programmazione di tipo cargo-cult, potrebbe essere necessario reimplementare le cose con un nuovo design. È anche pazzesco che tu rinomini qualcosa ovunque quando rinomini qualcosa perché ti rendi conto di aver dato un nome sbagliato a una variabile? Dai, Alexey ... :) Sed è tuo amico ... – lpapp

+2

@lpapp Questo è folle perché se il file di immagine rimane nello stesso posto, allora è assolutamente normale che il riferimento a questo file rimanga lo stesso nel codice dell'applicazione e non dipendere dallo spostamento di altre cose. No? Se alcuni file QML si riferiscono ad alcune immagini e questa immagine rimane sempre nello stesso posto, perché è necessario correggere quel QML ogni volta che vuole spostarlo in un'altra cartella? Questo è ciò di cui sto parlando. Quando si usano i file qrc non si ha questo problema, ma con le risorse raw non riusciamo a trovare una soluzione, sfortunatamente. –

risposta

10

Se non è possibile utilizzare un file .qrc per le immagini, si potrebbe provare questo:

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QQmlContext> 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 
    engine.rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath()); 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    return app.exec(); 
} 

In QML, si sarebbe poi fare:

Image { 
    source: "file:///" + applicationDirPath + "/../resources/images/image.png" 
} 

Si noti che questo codice non è testato

+2

Grazie a @Mitch! Sembra essere una possibile soluzione. L'ho appena testato. Per farlo funzionare correttamente è necessario anteporre '' file: /// "' a 'QGuiApplication :: applicationDirPath()'. E sembra che il valore 'applicationDirPath' sia stato iniettato in tutti i file QML caricati dall'applicazione, non solo in quello principale caricato da' engine.load (...) '(ero preoccupato all'inizio). Potrebbe essere migliorato un po 'passando la directory di lavoro corrente del processo, per evitare il '/../' nel percorso delle risorse relative e dovrebbe funzionare nelle esecuzioni di debug in QT Creator e nelle esecuzioni di applicazioni standalone. Molte grazie! –

+0

Non saprei dire, perché non l'ho provato con un benchmark. È molto semplice impostare un benchmark con il wizard di progetto di Qt Creator (anche con un benchmark QML) e Creator's QML Profiler può aiutarti a individuare eventuali colli di bottiglia. – Mitch

+0

Grazie @ Mitch! Esaminerà il profilo QML. –

1
Image { 
    source: "file:resources/images/image.png" 
} 

funzionerà se la directory di lavoro è impostata sul ApplicationFolder

nota: quando si esegue da QtCreator, doppio controllo quale directory l'applicazione è effettivamente in esecuzione in (ho avuto la mia corsa applicazione a casa mia directory anche se la directory di lavoro è stata impostata correttamente nella configurazione di esecuzione (dopo averla eseguita una volta in una finestra di terminale si è riparata magicamente))

Problemi correlati