在macOS上为Qt提供暗模式图标

在macOS上为Qt提供暗模式图标,macos,qt,macos-darkmode,Macos,Qt,Macos Darkmode,我用Qt5.13编写的应用程序使用QToolBar。要在其上放置图标,我的源代码中有以下行: const QIcon openIcon = QIcon::fromTheme("document-open", QIcon(":/images/open.png")); 这很好地工作,当黑暗模式被激活时,应用程序外观会发生变化。图标会被自动处理成倒转的样子,但效果不太好,看起来很糟糕 有没有办法提供Qt在黑暗模式下使用的图标?或者,有没有办法阻止Qt反转我的图标,因为它们在暗模式下也能很好地工作?解

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

const QIcon openIcon = QIcon::fromTheme("document-open", QIcon(":/images/open.png"));
这很好地工作,当黑暗模式被激活时,应用程序外观会发生变化。图标会被自动处理成倒转的样子,但效果不太好,看起来很糟糕


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

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

现在是关于检测暗模式变化的部分。这部分可能有点棘手,但它是可行的。基本上,你应该在ObjtoC++中引入本地代码(这样,你就可以使用命名空间、头等,即C++的东西),然后添加目标C代码,添加侦听器来进行暗模式的更改。您可能希望将侦听器添加到的参数的名称为“AppleInterfaceHemeChangedNotification”

最后,对您的问题提出更直接的想法,这些想法不一定有效(我认为,检测暗模式变化的方法肯定有效),但可能值得尝试:

  • 您是否尝试过在所有州将PNG图标的pixmap添加到QIcon?你可以在这里看到:
  • 不确定这是否可行,但也许设置一个面具的标志会有所帮助
  • 您是否尝试过将小部件添加到QToolBar而不是操作:?也许添加自定义小部件不会让你的图标看起来很恐怖,尽管它们显示的是什么模式?当然,请记住,在这种特定情况下,您可能需要创建自己的小部件

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

    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
    }
    
    至于如何捆绑图标:我不打算讨论这个问题,但这里有一个很好的指南:


    在windows下处理主题时,在Designer中编辑.ui时是否仍能看到图标?