Application icon in PySide GUI

PySide needs access to a special DLL to read .ico files. I think it's qico4.dll.

You could try changing the call to setWindowIcon to open the icon as a .png and put a .png of it in the ./dist directory and see if that works. If so, then your code is fine and I'm pretty sure it's the .dll problem. You'll need to tell cx_freeze to include the dll in the build.

I think PySide provides the embedded .ico to Windows and doesn't need to be able to read the data itself, so that's why this is working. However to read either the embedded icon resource or the ico file in the executable directory, it'll need the DLL.


I was having the same problem and this is how I solved it. I had the icon in a png file (but I guess it also works with other formats.

First in Linux I dumped the image file content into a file with the following:

hexdump -v -e '"\\x" 1/1 "%02x" ' icon.png > icon.py

Then I edited icon.py to have the following format:

icon = b'hexdump'

e.g.

icon = b'\xf3\a3'

Then I imported the icon with:

from icon import icon

Then I set the icon with the following:

qp = QtGui.QPixmap()
qp.loadFromData(icon)
appIcon = QtGui.QIcon(qp)
self.setWindowIcon(appIcon)

And it worked. I think this is the most robust way. cx_Freeze can't interfere with it.


I found another solution that doesn't require having the icon in both PNG and ICO formats. As Simon mentions in his answer, qico4.dll is required to read the .ico files. Also, this file needs to be placed in a directory named imageformats that is a subdirectory of your app directory. The folder structure should look like this:

My Gui
|
|-- MyGui.exe
|-- QtCore4.dll
|-- QtGui4.dll
|-- ...
|
|-- imageformats
    |
    |-- qico4.dll

qico4.dll is installed with your PySide distribution. If you pick typical installation options the file should be under

os.path.join(os.path.dirname(sys.executable), 
             'Lib',
             'site-packages',
             'PySide',
             'plugins',
             'imageformats' )