最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

【正文開(kāi)始】

一、使用效果

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

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

  • 類定義與屬性

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

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

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

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

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是兩個(gè)不可用于綁定的方法,它們立即返回當(dāng)前的主題顏色和顏色方案,但不會(huì)觸發(fā)任何更新通知。這兩個(gè)方法主要用于快速獲取當(dāng)前設(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是兩個(gè)可用于綁定的方法,它們返回當(dāng)前的主題顏色和顏色方案,并在值發(fā)生變化時(shí)發(fā)出通知。這兩個(gè)方法內(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è)置窗口標(biāo)題欄模式

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

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
}

定時(shí)器事件處理

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

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

三、實(shí)現(xiàn)細(xì)節(jié)

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

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

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

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

更新函數(shù)

_updateThemeColor_updateColorScheme是兩個(gè)更新函數(shù),它們檢查當(dāng)前的主題顏色和顏色方案是否發(fā)生變化,并在變化時(shí)更新成員變量并發(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();
    }
}

平臺(tái)特定的實(shí)現(xiàn)

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

#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é)語(yǔ)】

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

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

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

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

相關(guān)文章

  • C/C++中二進(jìn)制文件&順序讀寫(xiě)詳解及其作用介紹

    C/C++中二進(jìn)制文件&順序讀寫(xiě)詳解及其作用介紹

    這篇文章主要介紹了C/C++中二進(jìn)制文件&順序讀寫(xiě)詳解及其作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C++示例講解vector容器

    C++示例講解vector容器

    這篇文章主要介紹了C++?容器?Vector?的使用方法,Vector?是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組,有點(diǎn)類似數(shù)組,是一個(gè)連續(xù)地址空間,下文更多詳細(xì)內(nèi)容的介紹,需要的小伙伴可以參考一下
    2022-07-07
  • C++中多線程的執(zhí)行順序如你預(yù)期嗎

    C++中多線程的執(zhí)行順序如你預(yù)期嗎

    這篇文章主要為大家詳細(xì)介紹一下C++中多線程的執(zhí)行順序的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++多線程有一定幫助,需要的可以參考一下
    2022-10-10
  • C++中運(yùn)算符 &和&&、|和|| 的詳解及區(qū)別

    C++中運(yùn)算符 &和&&、|和|| 的詳解及區(qū)別

    這篇文章主要介紹了C++中運(yùn)算符 &和&&、|和|| 的詳解及區(qū)別的相關(guān)資料,這里舉例說(shuō)明該如何區(qū)別他們的不同,需要的朋友可以參考下
    2016-11-11
  • Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串

    Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以自己動(dòng)手嘗試一下
    2023-07-07
  • C++智能指針讀書(shū)筆記

    C++智能指針讀書(shū)筆記

    本篇隨筆僅作為個(gè)人學(xué)習(xí)《C++ Primer》智能指針一節(jié)后的部分小結(jié),抄書(shū)嚴(yán)重,伴隨個(gè)人理解。主要介紹shared_ptr、make_shared、weak_ptr的用法和聯(lián)系
    2015-11-11
  • C++中spdlog的簡(jiǎn)單使用示例

    C++中spdlog的簡(jiǎn)單使用示例

    spdlog是一個(gè)開(kāi)源、跨平臺(tái)、無(wú)依賴、只有頭文件的C++11日志庫(kù),所以這篇文章主要來(lái)和大家介紹一下一個(gè)簡(jiǎn)單的spdlog使用示例,感興趣的小伙伴可以了解一下
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言實(shí)現(xiàn)停車管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)停車管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)停車管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++ 基于BFS算法的走迷宮自動(dòng)尋路的實(shí)現(xiàn)

    C++ 基于BFS算法的走迷宮自動(dòng)尋路的實(shí)現(xiàn)

    這篇文章主要為大家介紹了C++ 基于BFS算法實(shí)現(xiàn)走迷宮自動(dòng)尋路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

桦南县| 香港 | 定远县| 南溪县| 那曲县| 木兰县| 名山县| 民勤县| 五常市| 克拉玛依市| 会泽县| 揭阳市| 绥德县| 西盟| 于都县| 基隆市| 沧州市| 宁都县| 河西区| 环江| 洪江市| 临朐县| 朝阳区| 宾阳县| 获嘉县| 平乐县| 南宫市| 白城市| 肥乡县| 宜都市| 望都县| 三江| 亳州市| 思茅市| 法库县| 英吉沙县| 睢宁县| 兴国县| 洛扎县| 河南省| 屏南县|