如何在菜单中显示彩色图标,PyQt?

2 投票
1 回答
3256 浏览
提问于 2025-04-17 21:37

我想做的是在Python中显示带颜色的图标在上下文菜单里。这样可以展示一些用来标记表格的颜色。

下面是我想要实现的效果的一个例子。

这里插入图片描述

你们觉得怎么才能做到这一点呢?

更新

这是我想法的更详细版本。

点击“标记”后,会弹出一个子菜单,里面有颜色选项。

这里插入图片描述

1 个回答

3

你可以很简单地使用一个叫做 QWidgetAction 的东西来做到这一点。

下面的示例代码使用了带图标的工具按钮来显示颜色网格,但其实还有很多其他的控件也可以轻松使用。如果你需要不同的颜色组合,可以重新实现 palette 方法。

class ColorAction(QtGui.QWidgetAction):
    colorSelected = QtCore.pyqtSignal(QtGui.QColor)

    def __init__(self, parent):
        QtGui.QWidgetAction.__init__(self, parent)
        widget = QtGui.QWidget(parent)
        layout = QtGui.QGridLayout(widget)
        layout.setSpacing(0)
        layout.setContentsMargins(2, 2, 2, 2)
        palette = self.palette()
        count = len(palette)
        rows = count // round(count ** .5)
        for row in range(rows):
            for column in range(count // rows):
                color = palette.pop()
                button = QtGui.QToolButton(widget)
                button.setAutoRaise(True)
                button.clicked[()].connect(
                    lambda color=color: self.handleButton(color))
                pixmap = QtGui.QPixmap(16, 16)
                pixmap.fill(color)
                button.setIcon(QtGui.QIcon(pixmap))
                layout.addWidget(button, row, column)
        self.setDefaultWidget(widget)

    def handleButton(self, color):
        self.parent().hide()
        self.colorSelected.emit(color)

    def palette(self):
        palette = []
        for g in range(4):
            for r in range(4):
                for b in range(3):
                    palette.append(QtGui.QColor(
                        r * 255 // 3, g * 255 // 3, b * 255 // 2))
        return palette

class ColorMenu(QtGui.QMenu):
    def __init__(self, parent):
        QtGui.QMenu.__init__(self, parent)
        self.colorAction = ColorAction(self)
        self.colorAction.colorSelected.connect(self.handleColorSelected)
        self.addAction(self.colorAction)
        self.addSeparator()
        self.addAction('Custom Color...')

    def handleColorSelected(self, color):
        print(color.name())

撰写回答