在 macOS 上为 Qt 提供深色模式图标



我用Qt 5.13编写的应用程序使用QToolBar。要在其上放置图标,我的源代码中有以下行:

const QIcon openIcon = QIcon::fromTheme("document-open", QIcon(":/images/open.png"));

这很有效,激活暗模式时应用程序外观会发生变化。图标会自动处理以看起来反转,但这效果不佳,它们看起来很糟糕。

有没有办法提供Qt用于暗模式的图标?或者,有没有办法阻止Qt反转我的图标,因为它们在暗模式下也能很好地工作?

解决所述问题的一种方法是引入侦听器进行暗模式更改,然后在 QToolBar 中相应地更改图标。正如我从 QToolBar 文档中看到的,这样做的简单方法是调用 QToolBar::clear((,然后再次将所有操作加在一起。

现在关于检测暗模式的部分发生了变化。这部分可能有点棘手,但这是可行的。基本上,您应该在 Objective C++ 中引入本机代码(因此,您将能够使用命名空间、标头等,即来自 C++ 的内容(,然后添加 Objective C 代码,为暗模式更改添加侦听器。您可能希望添加侦听器的参数的名称是"AppleInterfaceThemeChangedNotification"。

最后,对你的问题有更直接的想法,这些想法不能保证有效(我认为检测暗模式变化的方法肯定会奏效(,但可能值得一试:

  1. 您是否尝试过将PNG图标的像素图添加到所有州的QIcon中?你可以在这里看到它:https://doc.qt.io/qt-5/qicon.html#addPixmap
  2. 不确定这是否有效,但也许设置面具标志会有所作为? https://doc.qt.io/qt-5/qicon.html#setIsMask
  3. 您是否尝试过将小部件添加到QToolBar而不是操作:https://doc.qt.io/qt-5/qtoolbar.html#addWidget?也许添加自定义小部件不会使您的图标看起来很糟糕,尽管它们显示的模式是什么?当然,请记住,在这种特定情况下,您可能必须创建自己的小部件。

捆绑两组图标,并在调色板更改时在它们之间切换。

void MainWindow::changeEvent(QEvent *event)
{
#ifdef Q_OS_MACOS
// These aren't "examples". They're literally the actual values.
constexpr int OSX_LIGHT_MODE = 236;
constexpr int OSX_DARK_MODE = 50;
QStringLiteral LIGHT_THEME{"breeze"};
QStringLiteral DARK_THEME{"breeze-dark"};
if (event->type() == QEvent::PaletteChange) {
auto bg = palette().color(QPalette::Active, QPalette::Window);
// Calling setThemeName changes every visible icon, instantly.
if (bg.lightness() == OSX_LIGHT_MODE) {
QIcon::setThemeName(LIGHT_THEME);
} else {
QIcon::setThemeName(DARK_THEME);
}
}
#else
Q_UNUSED(event)
#endif
}

至于如何捆绑图标:我不打算深入讨论,但这里有一个很好的指南:

在所有平台上使用Qt图标主题的指南

最新更新