亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Qt實現(xiàn)系統(tǒng)主題感知功能

 更新時間:2024年12月29日 08:31:56   作者:夢起丶  
在現(xiàn)代桌面應(yīng)用程序開發(fā)中,系統(tǒng)主題感知是一項重要的功能,它使得應(yīng)用程序能夠根據(jù)用戶的系統(tǒng)主題設(shè)置(如深色模式或淺色模式)自動調(diào)整其外觀,Qt 作為一個跨平臺的C++圖形用戶界面應(yīng)用程序開發(fā)框架,提供了豐富的工具和類來實現(xiàn)這一功能,需要的朋友可以參考下

【正文開始】

一、使用效果

二、系統(tǒng)主題感知助手類(SystemThemeHelper)

SystemThemeHelper類是一個封裝了系統(tǒng)主題感知功能的Qt對象。它主要通過讀取系統(tǒng)設(shè)置和監(jiān)聽系統(tǒng)主題變化來更新應(yīng)用程序的主題顏色和顏色方案。

  • 類定義與屬性

    systemthemehelper.h中,SystemThemeHelper類繼承自QObject,并定義了兩個屬性:themeColorcolorScheme。這兩個屬性分別表示當前的主題顏色和顏色方案(深色、淺色或無)。

class SystemThemeHelper : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QColor themeColor READ themeColor NOTIFY themeColorChanged)
    Q_PROPERTY(SystemThemeHelper::ColorScheme colorScheme READ colorScheme NOTIFY colorSchemeChanged)
    // ...
};
  • ColorScheme是一個枚舉類,定義了三種顏色方案:NoneDarkLight

  • 構(gòu)造函數(shù)與析構(gòu)函數(shù)

    SystemThemeHelper的構(gòu)造函數(shù)初始化了一些私有成員變量,并啟動了一個定時器,用于定期更新主題顏色和顏色方案。析構(gòu)函數(shù)則負責清理資源。

SystemThemeHelper::SystemThemeHelper(QObject *parent)
    : QObject{parent}, d_ptr(new SystemThemeHelperPrivate(this))
{
    Q_D(SystemThemeHelper);
    d->m_themeColor = getThemeColor();
    d->m_colorScheme = getColorScheme();
    d->m_timer.start(200, this);
    #ifdef Q_OS_WIN
    initializeFunctionPointers();
    #endif
}

SystemThemeHelper::~SystemThemeHelper()
{
    // 清理資源
}

獲取主題顏色和顏色方案

getThemeColorgetColorScheme是兩個不可用于綁定的方法,它們立即返回當前的主題顏色和顏色方案,但不會觸發(fā)任何更新通知。這兩個方法主要用于快速獲取當前設(shè)置,而不關(guān)心后續(xù)的變化。

QColor SystemThemeHelper::getThemeColor() const
{
    Q_D(const SystemThemeHelper);
    #ifdef Q_OS_WIN
    return QColor::fromRgb(d->m_themeColorSettings.value("ColorizationColor").toUInt());
    #endif
}

SystemThemeHelper::ColorScheme SystemThemeHelper::getColorScheme() const
{
    Q_D(const SystemThemeHelper);
    #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
    const auto scheme = QGuiApplication::styleHints()->colorScheme();
    return scheme == Qt::ColorScheme::Dark ? ColorScheme::Dark : ColorScheme::Light;
    #else
    #ifdef Q_OS_WIN
    return !d->m_colorSchemeSettings.value("AppsUseLightTheme").toBool() ? ColorScheme::Dark : ColorScheme::Light;
    #else //linux
    const QPalette defaultPalette;
    const auto text = defaultPalette.color(QPalette::WindowText);
    const auto window = defaultPalette.color(QPalette::Window);
    return text.lightness() > window.lightness() ? ColorScheme::Dark : ColorScheme::Light;
    #endif // Q_OS_WIN
    #endif // QT_VERSION
}

更新主題顏色和顏色方案

themeColorcolorScheme是兩個可用于綁定的方法,它們返回當前的主題顏色和顏色方案,并在值發(fā)生變化時發(fā)出通知。這兩個方法內(nèi)部調(diào)用了私有成員函數(shù)的更新邏輯。

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;
}

設(shè)置窗口標題欄模式

setWindowTitleBarMode方法允許設(shè)置窗口標題欄的模式(深色或淺色)。這個方法在Windows平臺上通過調(diào)用 DWM API 實現(xiàn),而在其他平臺上則不支持。

bool SystemThemeHelper::setWindowTitleBarMode(QWindow *window, bool isDark)
{
    #ifdef Q_OS_WIN
    return bool(pDwmSetWindowAttribute ? !pDwmSetWindowAttribute(HWND(window->winId()), 20, &isDark, sizeof(BOOL)) : false);
    #else
    return false;
    #endif //Q_OS_WIN
}

定時器事件處理

timerEvent方法是一個虛函數(shù),用于處理定時器事件。它定期調(diào)用更新函數(shù)來檢查主題顏色和顏色方案是否發(fā)生變化,并在變化時發(fā)出通知。

void SystemThemeHelper::timerEvent(QTimerEvent *)
{
    Q_D(SystemThemeHelper);
    d->_updateThemeColor();
    d->_updateColorScheme();
}

三、實現(xiàn)細節(jié)

SystemThemeHelperPrivateSystemThemeHelper的私有實現(xiàn)類,它封裝了所有的實現(xiàn)細節(jié)和狀態(tài)變量。這個類主要負責讀取系統(tǒng)設(shè)置、更新主題顏色和顏色方案,并發(fā)出通知。

  • 構(gòu)造函數(shù)與成員變量

    SystemThemeHelperPrivate的構(gòu)造函數(shù)接收一個指向SystemThemeHelper的指針,并初始化成員變量。成員變量包括主題顏色、顏色方案、定時器和一些平臺特定的設(shè)置對象。

SystemThemeHelperPrivate::SystemThemeHelperPrivate(SystemThemeHelper *q)
    : q_ptr(q)
{
    // 初始化成員變量
}

更新函數(shù)

_updateThemeColor_updateColorScheme是兩個更新函數(shù),它們檢查當前的主題顏色和顏色方案是否發(fā)生變化,并在變化時更新成員變量并發(fā)出通知。

void SystemThemeHelperPrivate::_updateThemeColor()
{
    Q_Q(SystemThemeHelper);
    auto nowThemeColor = q->getThemeColor();
    if (nowThemeColor != m_themeColor) {
        m_themeColor = nowThemeColor;
        emit q->themeColorChanged();
    }
}

void SystemThemeHelperPrivate::_updateColorScheme()
{
    Q_Q(SystemThemeHelper);
    auto nowColorScheme = q->getColorScheme();
    if (nowColorScheme != m_colorScheme) {
        m_colorScheme = nowColorScheme;
        emit q->colorSchemeChanged();
    }
}

平臺特定的實現(xiàn)

在Windows平臺上,SystemThemeHelperPrivate使用QSettings來讀取系統(tǒng)主題設(shè)置,并使用DWM API來設(shè)置窗口標題欄的模式。這些實現(xiàn)細節(jié)被封裝在條件編譯塊中,以確??缙脚_的兼容性。

#ifdef Q_OS_WIN
QSettings m_themeColorSettings{QSettings::UserScope, "Microsoft", "Windows\\DWM"};
QSettings m_colorSchemeSettings{QSettings::UserScope, "Microsoft", "Windows\\CurrentVersion\\Themes\\Personalize"};
static DwmSetWindowAttributeFunc pDwmSetWindowAttribute = nullptr;
// ...
static inline bool initializeFunctionPointers()
{
    // 初始化DWM API函數(shù)指針
}
#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.15
import QtQuick.Window 2.15

import DelegateUI.Utils 1.0

Window {
    id: window
    width: 640
    height: 480
    visible: true
    title: 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: 32
        color: themeHelper.themeColor
    }
}

【結(jié)語】

通過SystemThemeHelper類,我們可以在 Qt 應(yīng)用程序中實現(xiàn)系統(tǒng)主題感知功能。

這個類封裝了讀取系統(tǒng)設(shè)置、更新主題顏色和顏色方案以及發(fā)出通知的邏輯,使得我們可以輕松地根據(jù)系統(tǒng)主題變化來調(diào)整應(yīng)用程序的外觀。

此外,通過條件編譯和平臺特定的實現(xiàn),還確保了跨平臺的兼容性。

以上就是基于Qt實現(xiàn)系統(tǒng)主題感知功能的詳細內(nèi)容,更多關(guān)于Qt系統(tǒng)主題感知的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論