将Qicon禁用模式用于关闭状态



我有一堆可检查的QToolbuttons,我希望图标在未检查状态下"变灰"。我可以通过在QIcon中为打开/关闭状态设置不同的文件来实现这一点。像这样:

tb = QToolButton()
tb.setCheckable(True)
ico = QIcon()
ico.addFile('color.jpg', QSize(16, 16), QIcon.Normal, QIcon.On)
ico.addFile('grey.jpg', QSize(16, 16), QIcon.Normal, QIcon.Off)
tb.setIcon(ico)

但由于QIcon可以创建一个在禁用模式下使用的"灰色"版本,我更喜欢使用禁用模式图标,而不是自己创建所有图标的灰色版本。这可能吗?

您可以使用QIcon.pixmap()Disabled状态获得灰色图标,然后将其再次设置为所需模式。

由于您希望它处于Off状态(默认状态(,因此您必须首先将像素图设置为On状态,获得灰显的像素图,然后将其设置为其他状态:

original = QtGui.QPixmap('icon.png')
icon = QtGui.QIcon()
icon.addPixmap(original, QtGui.QIcon.Normal, QtGui.QIcon.On)
grayed = icon.pixmap(original.size(), QtGui.QIcon.Disabled, QtGui.QIcon.On)
icon.addPixmap(grayed, QtGui.QIcon.Normal, QtGui.QIcon.Off)

请注意,虽然Qt的常见行为是使图像变灰,但不能保证它会在所有平台和样式上发生。

由于我们谈论的是图标,我们可以假设它们非常小,所以我们可以使用辅助功能来获得灰显的像素图(同时仍然尊重alpha通道(:

def getGrayed(src):
if isinstance(src, QtGui.QPixmap):
src = src.toImage()
dest = QtGui.QImage(src.size(), QtGui.QImage.Format_ARGB32)
widthRange = range(src.width())
for y in range(src.height()):
for x in widthRange:
pixel = src.pixelColor(x, y)
alpha = pixel.alpha()
if alpha < 255:
alpha //= 3
gray = QtGui.qGray(src.pixel(x, y))
pixel.setRgb(gray, gray, gray, alpha)
dest.setPixelColor(x, y, pixel)
return QtGui.QPixmap.fromImage(dest)

然后,做类似于上面的事情:

original = QtGui.QPixmap('iconalpha.png')
icon = QtGui.QIcon(getGrayed(original))
icon.addPixmap(original, QtGui.QIcon.Normal, QtGui.QIcon.On)

显然,如果有许多源图标并且它们的大小以某种方式为"0",则这可能是非常苛刻的;"大";(256x256或更大(
如果您担心性能问题,可以将上述getGrayed()函数转换为一个简单的脚本,该脚本会自动创建灰显图标。

请注意,如果代码中多次需要该功能,您可能会考虑创建自己的QIconEngine子类,并创建一个自定义静态函数,以根据需要获得首选图标(已设置模式(。

最新更新