On Dec 24, 2012, at 8:22 AM, Alan Alpert <4163654...@gmail.com> wrote:

> For those interested in the matter, the discussion has now moved to 
> codereview.
> 
> https://codereview.qt-project.org/#change,43539 adds the QQmlApplicationEngine
> https://codereview.qt-project.org/#change,43540 adds the qml tool using it
> 
> The one thing missing from QQmlApplicationEngine is the resolution of
> different paths for different platforms. I'd be interested in ideas on
> how best to expose that, it might even be part of a more general
> device-independent code discussion. But I think that can wait for the
> next patch to QQmlApplicationEngine, it's still useful for the cases
> where you know your platform/path already.


I startet mapping out a solution to this a while ago but was unable to find 
something workable:  I ended up using a preprocessor macro which does not work 
from QML. I'll post it here anyway, perhaps someone else can pick it up and 
find a better solution.

The core of the problem (with this solution) seems to be setting a data path at 
build time, reading and overriding it at deploy time, and then finally reading 
it at runtime from C++ and QML.

A different approach exist in the form of qFindTestData(qtestcase.cpp), which 
searches various locations for data files. 

Here's my proposal:

1) The app author places the data files in a designated directory and adds an 
entry to the .pro file:

APPDATAPATH = $$PWD/data

2) At runtime the path and files can be found again using a QAPPDATAPATH macro

QString filePath = QAPPDATAPATH + "/myfile";
QFile file(filePath);
file.open(QIODevice::ReadOnly) // We only guarantee read access.

(If we can get away from a macro to something nicer like 
"QDesktopServices::AppDataLocation" we should definitively do that. The 
challenge is how to set it at app compile time.)

3) Moving the files and setting AppDataLocation is done at the build and/or 
deployment stage. This will vary depending on the Qt configuration and platform.

Some cases (where I know the details):
- developer builds: No copying required. AppDataLocation points directly to 
APPDATAPATH in the source dir.
- prefix builds: The contents of APPDATAPATH is copied during "make install" 
and AppDataLocation is set to the install location.
- iOS/Xocde integration: Add files to "Resources" folder in project. Set 
AppDataLocation to point to "Resources" in the app bundle.
- macdeployqt: Copy files to the app bundle. Set AppDataLocation like the Xcode 
case.

AppDataLocation needs to be set at build/deploy time, for example using qt.conf 
similar to how we set the plugin path today.

Morten

_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to