我需要创建一个更改 QWidget 背景的菜单。我想将代表所选颜色的 QIcon 放入填充 QMenu 的 QActions 中。我不想弹出 Photoshop 并手动绘制图标。 是否可以编写一个填充某种颜色的简单图标? 这样,如果需要,我可以拥有任意数量的 QAction,而且我不必在 Photoshop 中制作一大堆图标。 \
您可以从 QPixmap 构造 QIcon。 QPixmap 可以用给定的大小构建,然后使用“fill”填充颜色。
例如,要创建一个红色的 100x100 图标:
QPixmap pixmap(100,100);
pixmap.fill(QColor("red"));
QIcon redIcon(pixmap);
刚刚弄清楚如何将图标颜色更改为任何其他颜色。因此,图标的图像必须由一种纯色(此处:“黑色”)组成,可以使用像素图及其遮罩能力将其转换为另一种颜色(如“红色”):
pixmap = QPixmap(filename)
mask = pixmap.createMaskFromColor(QColor('black'), Qt.MaskOutColor)
pixmap.fill((QColor('red')))
pixmap.setMask(mask)
btNew = QToolButton()
btNew.setIcon(QIcon(pixmap))
我知道这是一个非常古老的问题,但这仍然是 Google 上第一个更改 QIcon 颜色的结果。
虽然 createMaskFromColor 和 createAlphaMask 方法在技术上产生了一些可行的东西,但我永远无法让它将超过 1 位的 alpha 数据传输到最终图像。这导致图像非常块状。 类似这样的图片
环顾四周时,我注意到这是一个相当典型的问题,我终于找到了“像素完美”的方法。首先将数据作为 QImage 加载。使用 Alpha8 格式创建另一个相同大小的 QImage。将原始图像绘制到 Alpha 图像上。最后,用目标颜色填充第三个 QImage,并将其与 alpha 的倒数进行异或。 结果是这样
QIcon loadedIcon;
QImage image(<FILENAME>);
QImage alpha(image.width(), image.height(), QImage::Format_Alpha8);
alpha.fill(Qt::transparent);
QImage transferedImage(image.width(), image.height(), image.format());
transferedImage.fill(QColor::fromString("#FFFFFF"));
QImage finalImage(image.width(), image.height(), image.format());
finalImage.fill(Qt::transparent);
QPainter painter;
painter.begin(&alpha);
painter.drawImage(image.rect(),image);
painter.end();
alpha.invertPixels(QImage::InvertRgba);
painter.begin(&finalImage);
painter.setRenderHint(QPainter::Antialiasing);
painter.drawImage(image.rect(), transferedImage);
painter.setCompositionMode(QPainter::CompositionMode_Xor);
painter.drawImage(image.rect(), alpha);
painter.end();
loadedIcon = QIcon(QPixmap::fromImage(finalImage));