QMenu with icons not happenning

so I am trying to make a QMenu have some icons but I am having no success.
I have no idea if there is a way to by pass this.

Minimal replaceable example for scripter:

from krita import *
from PyQt5 import QtWidgets, QtCore, QtGui, uic

icon = Krita.instance().icon('folder-pictures')
string = "Preview"
act = QAction()
act.setIcon(icon)
act.setText(string)

cmenu = QMenu()
cmenu_preview   = cmenu.addAction( act )
cmenu_grid      = cmenu.addAction("Grid")
cmenu_reference = cmenu.addAction("Reference")
# Execute
position = QPoint(100,100)
action = cmenu.exec_(position)
# Triggers
if action == cmenu_preview:
    pass
if action == cmenu_grid:
    pass
if action == cmenu_reference:
    pass

Hi

Icons are explicitly disabled for windows users…

If you want to show them:

if sys.platform=='win32':
    QApplication.setAttribute(Qt.AA_DontShowIconsInMenus, False)

But it will be available for ALL Krita’s Windows.
So should provide an option to let user decide if they want or not icons in menus (that’s what I did for Buli Commander)

Grum999

1 Like

So it was days and days researching for nothing… :upside_down_face: fun
it works with that.

but why would anyone not want icons if it is made with the icons?
are icons buggy on windows? I tested with pixmap icons and it seems to work perfectly for what I can see at a first glance. is it not working well with some other UI element?

What the hell Krita has a bunch of icons everywhere!

Commit description is not really explicit about why it has been disabled for windows user :man_shrugging:

Yes, on Linux they’re available without any need to force icon menu activation…

Grum999

1 Like

For me, the mystery stay a mystery :slight_smile:

Grum999

If you really wish to see icons in menu actions, you can use QAction.setIconVisibleInMenu(True), that overrides AA_DontShowIconsInMenus attribute.

from PyQt5.QtGui import (
        QIcon,
        QPixmap,
        QCursor)

from PyQt5.QtWidgets import (
        QAction,
        QMenu)


pixmap = QPixmap(24, 24)
pixmap.loadFromData(b"""\
<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#FF00FF">
    <rect fill="none" height="24" width="24"/>
    <path d="M12,22C6.49,22,2,17.51,2,12S6.49,2,12,2s10,4.04,10,9c0,3.31-2.69,6-6,6h-1.77c-0.28,0-0.5,0.22-0.5,0.5 c0,0.12,0.05,0.23,0.13,0.33c0.41,0.47,0.64,1.06,0.64,1.67C14.5,20.88,13.38,22,12,22z M12,4c-4.41,0-8,3.59-8,8s3.59,8,8,8 c0.28,0,0.5-0.22,0.5-0.5c0-0.16-0.08-0.28-0.14-0.35c-0.41-0.46-0.63-1.05-0.63-1.65c0-1.38,1.12-2.5,2.5-2.5H16 c2.21,0,4-1.79,4-4C20,7.14,16.41,4,12,4z"/>
    <circle cx="6.5" cy="11.5" r="1.5"/>
    <circle cx="9.5" cy="7.5" r="1.5"/>
    <circle cx="14.5" cy="7.5" r="1.5"/>
    <circle cx="17.5" cy="11.5" r="1.5"/>
</svg>
""", format='svg')

menu = QMenu()
menu.addActions([
        QAction(text="I'm with Icon!",
                icon=QIcon(pixmap),
                iconVisibleInMenu=True,  # overrides Qt.AA_DontShowIconsInMenu
                parent=menu),
        QAction(text="I'm with ... nothing!",
                icon=QIcon(pixmap),
                parent=menu)
        ])
menu.exec_(QCursor.pos())

/AkiR

I think I found the issue

sample:

from krita import *
from PyQt5 import QtWidgets, QtCore, QtGui, uic

QApplication.setAttribute(Qt.AA_DontShowIconsInMenus, True)

icon = Krita.instance().icon('folder-pictures')

cmenu = QMenu()

action_0 = QAction(text="0",
                icon=icon,
                iconVisibleInMenu=True,  # overrides Qt.AA_DontShowIconsInMenu
                parent=cmenu
                )
action_1 = QAction(text="1",
                icon=icon,
                iconVisibleInMenu=True,  # overrides Qt.AA_DontShowIconsInMenu
                parent=cmenu
                )
action_2 = QAction(text="2",
                icon=icon,
                iconVisibleInMenu=True,  # overrides Qt.AA_DontShowIconsInMenu
                parent=cmenu
                )
                
cmenu_0 = cmenu.addAction(action_0)
cmenu_1 = cmenu.addAction(action_1)
cmenu_2 = cmenu.addAction(action_2)

# Execute
position = QPoint(100,100)
action = cmenu.exec_(position)
# Triggers
if action == cmenu_0:
    QtCore.qDebug("0")
if action == cmenu_1:
    QtCore.qDebug("1")
if action == cmenu_2:
    QtCore.qDebug("2")

If you have the icon set on the action before you set it up on the qmenu it will not trigger the action.

however if you set up the icon on the qmenu element it will trigger the action.

sample:

from krita import *
from PyQt5 import QtWidgets, QtCore, QtGui, uic

QApplication.setAttribute(Qt.AA_DontShowIconsInMenus, False)

icon = Krita.instance().icon('folder-pictures')

cmenu = QMenu()

cmenu_0 = cmenu.addAction("0")
cmenu_1 = cmenu.addAction("1")
cmenu_2 = cmenu.addAction("2")
# Icons
cmenu_0.setIcon(icon)
cmenu_1.setIcon(icon)
cmenu_2.setIcon(icon)

# Execute
position = QPoint(100,100)
action = cmenu.exec_(position)
# Triggers
if action == cmenu_0:
    QtCore.qDebug("0")
if action == cmenu_1:
    QtCore.qDebug("1")
if action == cmenu_2:
    QtCore.qDebug("2")

Must be this the reason why it is unactive for Windows.

@EyeOdin @Grum999 i remembered asking this question about the icons

2 Likes

Sight seeing icons in windows

2 Likes