Monday, September 5, 2011

Generating Qt resource files from whole directory trees

Yesterday I had to scratch a little annoying itch. I had to embed a javascript library (MathJax) into a PyQt project of mine(Model-Builder). Embedding static files into Qt projects is done via resource files. I was surprised that Qt Designer resource editor has no way to recursively scan directories. You have to add files manually.

That was not an option for me since MathJax is somewhat large. Naturally this is a trivial thing to do in Python. But I could not find any tool to do that in a  google search, even though I found many messages to mailing lists asking for it. I decided to solve this problem not only for me but for the other suffering souls out there.

For those which are not familiar with resource files, they are a clever way to encode data as a source file (python module, for instance), this greatly facilitates the distribution of your project as you don't have to worry about static files as the become indistiguishable from source code. Single resource files, .qrc, may contain any number of files preserving their full path, so that they can accessed by you program via urls which start like this "qrc:///...". Resource files are defined as a simple XML file. Then a resource compiler, in PyQt4's case, pyrcc4, compiles the static files listed in the xml into a python .py file.

The script I created, qrcgen, takes a directory and a prefix, recursively scans the directory and generates a .qrc file with the same name as the directory scanned. It has solved my problem, and I hope it can help others. It is also available via PyPI, just "easy_install qrcgen".