如何在菜单中显示彩色图标,PyQt?
我想做的是在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())