QIcon
有一个 state 的概念,例如当从QIcon
请求像素图时,可以要求它为On
状态的像素图(如按下的按钮)或Off
状态。
创建状态感知QIcon
非常简单:只需使用QIcon::addPixmap()
和mode
参数的适当组合调用state
成员函数,即可将所需的pixmaps组合成QIcon
。
然而,当使用Qt的主题机制时,可以使用QIcon
静态成员函数创建QIcon::fromTheme()
。此函数返回的图标不支持状态。实际上,从Qt资料中我了解到,只有QIcon::Mode
可以动态应用,例如使Disabled
模式的图标变灰。
因此,请考虑我从主题onIcon
和offIcon
创建两个不同的图标,如何将它们合并为一个QIcon
以覆盖相应的State
?
答案 0 :(得分:0)
诀窍是使用QIcon::availableSizes
从每个图标中提取所有单独的像素图,然后为每个集合分配一个 role (模式+状态)。
这是一个仅带有打开和关闭状态的基本示例。
QIcon mergeIcons(const QIcon& on_icon, const QIcon& off_icon) {
QIcon new_icon;
const auto fn_add = [&new_icon](const QIcon& src, QIcon::Mode mode, QIcon::State state) {
const auto sizes = src.availableSizes();
for (const auto& size : sizes) {
new_icon.addPixmap(src.pixmap(size), mode, state);
}
};
fn_add(on_icon, QIcon::Normal, QIcon::On);
fn_add(off_icon, QIcon::Normal, QIcon::Off);
return new_icon;
}
然后只需加载源图标并合并它们:
const QIcon on_icon("on.ico");
const QIcon off_icon("off.ico");
ui->pushButton->setIcon(mergeIcons(on_icon, off_icon));