合并两个QIcon

时间:2017-11-13 18:54:04

标签: c++ qt

QIcon有一个 state 的概念,例如当从QIcon请求像素图时,可以要求它为On状态的像素图(如按下的按钮)或Off状态。

创建状态感知QIcon非常简单:只需使用QIcon::addPixmap()mode参数的适当组合调用state成员函数,即可将所需的pixmaps组合成QIcon

然而,当使用Qt的主题机制时,可以使用QIcon静态成员函数创建QIcon::fromTheme()。此函数返回的图标不支持状态。实际上,从Qt资料中我了解到,只有QIcon::Mode可以动态应用,例如使Disabled模式的图标变灰。

因此,请考虑我从主题onIconoffIcon创建两个不同的图标,如何将它们合并为一个QIcon以覆盖相应的State

1 个答案:

答案 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));