[PyQt] Changing current runtime directory prevent icons to be loaded from *.ui files

Yann Cointepas yann at sapetnioc.org
Fri Apr 16 12:10:53 BST 2010

Icons file names are relative  in *.ui files. When loadUi is used, PyQt4 (at
least for version 4.3.3) directly sends this relative path to QIcon
constructor. As a result icons cannot be loaded if Python current directory
is not the directory of the *.ui file. Changing the runtime directory before
calling loadUi is not always possible. For instance if you are in a
multithreaded application you may have problems if some threads are using
the current directory.

A solution could be to have a base directory for relative paths for each
*.ui file parser. This base directory would be set to the directory
containing the ui file. This can be done by modifying the
PyQt4.uic.properties.Property class so that the _iconset method uses this
base directory. Others methods could be changed in the same way (_pixmap for
instance). The following example show how _iconset could be modified to take
into account a base directory stored in an attribute named _basedirectory:

Current code (from PyQt 4.3.3 installed on Linux):

    def _iconset(self, prop):
        return QtGui.QIcon(prop.text.replace("\\", "\\\\"))

Modified code:

    def _iconset(self, prop):

For current version of PyQt, it is possible to use the following ugly code
do define a replacement function to loadUi:

import os
from functools import partial
from PyQt4 import QtGui, uic
from PyQt4.uic.Loader import loader

def _iconset(self, prop):
  return QtGui.QIcon( os.path.join( self._basedirectory, prop.text
).replace("\\", "\\\\") )

def loadUiWithIcons( ui, *args, **kwargs ):
  uiLoader = loader.DynamicUILoader()
  uiLoader.wprops._basedirectory = os.path.dirname( os.path.abspath( ui ) )
  uiLoader.wprops._iconset = partial( _iconset, uiLoader.wprops )
  return uiLoader.loadUi( ui, *args, **kwargs )

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20100416/ffc61d42/attachment.html>

More information about the PyQt mailing list