[Interest] creating a binary .rcc version of a series of Freedesktop icon themes linked through inheritance

René J.V. Bertin rjvbertin at gmail.com
Sat Jun 24 10:19:03 CEST 2017

Thiago Macieira wrote:

> If you compile them with qrc, then they register themselves.

Basically that would mean that qrc knows how to deal with inheritance declarations in the icon theme index.theme files?

> Sorry, I don't know the API.

It aims to be very simple and allow application developers to install an "icontheme.rcc" file in a QSP::AppDataLocation, which is then used for all theme lookups. It could of course be extended to load a plugin/shared library if there's a significant advantage in what one can do with that approach. But in that case it might even be possible to use a kind of plugin that Qt loads automatically during global startup?

Q_GLOBAL_STATIC(QString, _themeOverride)
// Support for icon themes in RCC files.
// The intended use case is standalone apps on Windows / MacOS / etc.
// For this reason we use AppDataLocation: BINDIR/data on Windows, Resources on OS X
void initRCCIconTheme()
    const QString iconThemeRcc = QStandardPaths::locate(QStandardPaths::AppDataLocation, QStringLiteral("icontheme.rcc"));
    if (!iconThemeRcc.isEmpty()) {
        const QString iconThemeName = QStringLiteral("kf5_rcc_theme");
        const QString iconSubdir = QStringLiteral("/icons/") + iconThemeName;
        if (QResource::registerResource(iconThemeRcc, iconSubdir)) {
            if (QFileInfo::exists(QLatin1Char(':') + iconSubdir + QStringLiteral("/index.theme"))) {
                // Tell Qt about the theme
                // Note that since qtbase commit a8621a3f8, this means the QPA (i.e. KIconLoader) will NOT be used.
                QIcon::setThemeName(iconThemeName); // Qt looks under :/icons automatically
                // Tell KIconTheme about the theme, in case KIconLoader is used directly
                *_themeOverride() = iconThemeName;
            } else {
                qWarning() << "No index.theme found in" << iconThemeRcc;
                QResource::unregisterResource(iconThemeRcc, iconSubdir);
        } else {
            qWarning() << "Invalid rcc file" << iconThemeRcc;

More information about the Interest mailing list