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

时间:2014-03-10 12:05:15

标签: python pyqt pyqt4 qmenu

我想要实现的是在python中的上下文菜单中显示颜色图标。这样它就会显示一些用来标记表格的颜色。

这是我想要实现的一个例子。

enter image description here

有什么猜测怎么做?

更新 这是我的愿景的更详细版本。

点击标记后,会打开一个带有颜色选项的子菜单。

enter image description here

1 个答案:

答案 0 :(得分: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())