admin管理员组文章数量:1516870
【写在前面】
在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观。
Qt 作为一个跨平台的C++图形用户界面应用程序开发框架,提供了丰富的工具和类来实现这一功能。
【正文开始】
一、使用效果
二、系统主题感知助手类(SystemThemeHelper)
SystemThemeHelper
类是一个封装了系统主题感知功能的Qt对象。它主要通过读取系统设置和监听系统主题变化来更新应用程序的主题颜色和颜色方案。
类定义与属性
在
systemthemehelper.h中,SystemThemeHelper类继承自QObject,并定义了两个属性:themeColor和colorScheme。这两个属性分别表示当前的主题颜色和颜色方案(深色、浅色或无)。classSystemThemeHelper:publicQObject{ Q_OBJECT Q_PROPERTY(QColor themeColor READ themeColor NOTIFY themeColorChanged)Q_PROPERTY(SystemThemeHelper::ColorScheme colorScheme READ colorScheme NOTIFY colorSchemeChanged)// ...};ColorScheme是一个枚举类,定义了三种颜色方案:None、Dark和Light。构造函数与析构函数
SystemThemeHelper的构造函数初始化了一些私有成员变量,并启动了一个定时器,用于定期更新主题颜色和颜色方案。析构函数则负责清理资源。SystemThemeHelper::SystemThemeHelper(QObject *parent): QObject{parent},d_ptr(newSystemThemeHelperPrivate(this)){Q_D(SystemThemeHelper); d->m_themeColor =getThemeColor(); d->m_colorScheme =getColorScheme(); d->m_timer.start(200,this);#ifdefQ_OS_WINinitializeFunctionPointers();#endif}SystemThemeHelper::~SystemThemeHelper(){// 清理资源}获取主题颜色和颜色方案
getThemeColor和getColorScheme是两个不可用于绑定的方法,它们立即返回当前的主题颜色和颜色方案,但不会触发任何更新通知。这两个方法主要用于快速获取当前设置,而不关心后续的变化。QColor SystemThemeHelper::getThemeColor()const{Q_D(const SystemThemeHelper);#ifdefQ_OS_WINreturnQColor::fromRgb(d->m_themeColorSettings.value("ColorizationColor").toUInt());#endif} SystemThemeHelper::ColorScheme SystemThemeHelper::getColorScheme()const{Q_D(const SystemThemeHelper);#ifQT_VERSION >=QT_VERSION_CHECK(6,5,0)constauto scheme =QGuiApplication::styleHints()->colorScheme();return scheme == Qt::ColorScheme::Dark ? ColorScheme::Dark : ColorScheme::Light;#else#ifdefQ_OS_WINreturn!d->m_colorSchemeSettings.value("AppsUseLightTheme").toBool()? ColorScheme::Dark : ColorScheme::Light;#else//linuxconst QPalette defaultPalette;constauto text = defaultPalette.color(QPalette::WindowText);constauto window = defaultPalette.color(QPalette::Window);return text.lightness()> window.lightness()? ColorScheme::Dark : ColorScheme::Light;#endif// Q_OS_WIN#endif// QT_VERSION}更新主题颜色和颜色方案
themeColor和colorScheme是两个可用于绑定的方法,它们返回当前的主题颜色和颜色方案,并在值发生变化时发出通知。这两个方法内部调用了私有成员函数的更新逻辑。QColor SystemThemeHelper::themeColor(){Q_D(SystemThemeHelper); d->_updateThemeColor();return d->m_themeColor;} SystemThemeHelper::ColorScheme SystemThemeHelper::colorScheme(){Q_D(SystemThemeHelper); d->_updateColorScheme();return d->m_colorScheme;}设置窗口标题栏模式
setWindowTitleBarMode方法允许设置窗口标题栏的模式(深色或浅色)。这个方法在Windows平台上通过调用DWM API实现,而在其他平台上则不支持。boolSystemThemeHelper::setWindowTitleBarMode(QWindow *window,bool isDark){#ifdefQ_OS_WINreturnbool(pDwmSetWindowAttribute ?!pDwmSetWindowAttribute(HWND(window->winId()),20,&isDark,sizeof(BOOL)):false);#elsereturnfalse;#endif//Q_OS_WIN}定时器事件处理
timerEvent方法是一个虚函数,用于处理定时器事件。它定期调用更新函数来检查主题颜色和颜色方案是否发生变化,并在变化时发出通知。voidSystemThemeHelper::timerEvent(QTimerEvent *){Q_D(SystemThemeHelper); d->_updateThemeColor(); d->_updateColorScheme();}
三、实现细节
SystemThemeHelperPrivate
是
SystemThemeHelper
的私有实现类,它封装了所有的实现细节和状态变量。这个类主要负责读取系统设置、更新主题颜色和颜色方案,并发出通知。
构造函数与成员变量
SystemThemeHelperPrivate的构造函数接收一个指向SystemThemeHelper的指针,并初始化成员变量。成员变量包括主题颜色、颜色方案、定时器和一些平台特定的设置对象。SystemThemeHelperPrivate::SystemThemeHelperPrivate(SystemThemeHelper *q):q_ptr(q){// 初始化成员变量}更新函数
_updateThemeColor和_updateColorScheme是两个更新函数,它们检查当前的主题颜色和颜色方案是否发生变化,并在变化时更新成员变量并发出通知。voidSystemThemeHelperPrivate::_updateThemeColor(){Q_Q(SystemThemeHelper);auto nowThemeColor = q->getThemeColor();if(nowThemeColor != m_themeColor){ m_themeColor = nowThemeColor; emit q->themeColorChanged();}}voidSystemThemeHelperPrivate::_updateColorScheme(){Q_Q(SystemThemeHelper);auto nowColorScheme = q->getColorScheme();if(nowColorScheme != m_colorScheme){ m_colorScheme = nowColorScheme; emit q->colorSchemeChanged();}}平台特定的实现
在Windows平台上,
SystemThemeHelperPrivate使用QSettings来读取系统主题设置,并使用DWM API来设置窗口标题栏的模式。这些实现细节被封装在条件编译块中,以确保跨平台的兼容性。#ifdefQ_OS_WIN QSettings m_themeColorSettings{QSettings::UserScope,"Microsoft","Windows\\DWM"}; QSettings m_colorSchemeSettings{QSettings::UserScope,"Microsoft","Windows\\CurrentVersion\\Themes\\Personalize"};static DwmSetWindowAttributeFunc pDwmSetWindowAttribute =nullptr;// ...staticinlineboolinitializeFunctionPointers(){// 初始化DWM API函数指针}#endif//Q_OS_WIN
四、如何使用
C++:
SystemThemeHelper *helper =new SystemThemeHelper;QObject::connect(helper,&SystemThemeHelper::themeColorChanged,[helper]{qDebug()<< helper->getThemeColor();});QObject::connect(helper,&SystemThemeHelper::colorSchemeChanged,[helper]{qDebug()<< helper->getColorScheme();});Qml:
import QtQuick 2.15import QtQuick.Window 2.15import DelegateUI.Utils 1.0
Window {id: window
width:640height:480visible:truetitle:qsTr("SystemThemeHelper Test - ")+(themeHelper.colorScheme == SystemThemeHelper.Dark ?"Dark":"Light")color: themeHelper.colorScheme == SystemThemeHelper.Dark ?"black":"white"
Behavior on color { ColorAnimation {}}
SystemThemeHelper {id: themeHelper
onThemeColorChanged:{
console.log("onThemeColorChanged:", themeColor);}onColorSchemeChanged:{setWindowTitleBarMode(window, themeHelper.colorScheme == SystemThemeHelper.Dark)
console.log("onColorSchemeChanged:", colorScheme);}
Component.onCompleted:{
console.log("onColorSchemeChanged:", colorScheme);setWindowTitleBarMode(window, themeHelper.colorScheme == SystemThemeHelper.Dark)}}
Text {
anchors.centerIn: parent
text:qsTr("主题颜色")
font.family:"微软雅黑"
font.pointSize:32color: themeHelper.themeColor
}}【结语】
通过
SystemThemeHelper
类,我们可以在 Qt 应用程序中实现系统主题感知功能。
这个类封装了读取系统设置、更新主题颜色和颜色方案以及发出通知的逻辑,使得我们可以轻松地根据系统主题变化来调整应用程序的外观。
此外,通过条件编译和平台特定的实现,还确保了跨平台的兼容性。
最后:项目链接(多多star呀…⭐_⭐):
Github:
Gitee:
版权声明:本文标题:Qt主题感知秘籍:简单步骤获取Windows色彩 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/biancheng/1770647971a3256984.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论