Qt 中的简单颜色填充 QIcons

问题描述 投票:0回答:3

我需要创建一个更改 QWidget 背景的菜单。我想将代表所选颜色的 QIcon 放入填充 QMenu 的 QActions 中。我不想弹出 Photoshop 并手动绘制图标。 是否可以编写一个填充某种颜色的简单图标? 这样,如果需要,我可以拥有任意数量的 QAction,而且我不必在 Photoshop 中制作一大堆图标。 \

c++ qt qmenu qicon
3个回答
24
投票

您可以从 QPixmap 构造 QIcon。 QPixmap 可以用给定的大小构建,然后使用“fill”填充颜色。

例如,要创建一个红色的 100x100 图标:

QPixmap pixmap(100,100);
pixmap.fill(QColor("red"));
QIcon redIcon(pixmap);

13
投票

刚刚弄清楚如何将图标颜色更改为任何其他颜色。因此,图标的图像必须由一种纯色(此处:“黑色”)组成,可以使用像素图及其遮罩能力将其转换为另一种颜色(如“红色”):

pixmap = QPixmap(filename)
mask = pixmap.createMaskFromColor(QColor('black'), Qt.MaskOutColor)
pixmap.fill((QColor('red')))
pixmap.setMask(mask)

btNew = QToolButton()
btNew.setIcon(QIcon(pixmap))

0
投票

我知道这是一个非常古老的问题,但这仍然是 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));
© www.soinside.com 2019 - 2024. All rights reserved.