前言:
在做项目或者开发QT软件时,如果想要修改窗口标题栏背景颜色,发现没有代码可以直接设置,目前有两种方法可以设置。
第一种,自定义一个界面类,用QLabel+QWidget实现,QLabel当作标题栏。
第二种,窗口标题栏背景色其实和Windows系统有关,通过与Windows系统接口修改。
这两种方法我都试了一遍,第一种方法适合自定义多种样式或者功能,代码较长,费时。以下主要介绍第二种方法。
效果图
这里是根据需求,将颜色设置为RGB(217, 237, 248)。
详细代码
Pro文件
LIBS += -ldwmapi
头文件
#ifdef _WIN32
#include <Windows.h>
#include <dwmapi.h>
#pragma comment(lib, "dwmapi.lib")
#endif
CPP文件
这个函数也可以将颜色抽取出来,使用参数传入。
// 定义 Windows 11 特有的属性(如果 SDK 版本较旧)
#ifndef DWMWA_CAPTION_COLOR
#define DWMWA_CAPTION_COLOR 35
#endif
#ifndef DWMWA_TEXT_COLOR
#define DWMWA_TEXT_COLOR 36
#endif
void SetTitleBarColor(QWidget* widget)
{auto setColorFunc = [widget]() {HWND hwnd = (HWND)widget->winId();if (hwnd) {// 检查系统是否支持这些属性BOOL supported = FALSE;if (SUCCEEDED(::DwmSetWindowAttribute(hwnd, DWMWA_CAPTION_COLOR,&supported, sizeof(supported)))) {COLORREF titleBarColor = RGB(217, 237, 248);::DwmSetWindowAttribute(hwnd, DWMWA_CAPTION_COLOR,&titleBarColor, sizeof(titleBarColor));COLORREF titleTextColor = RGB(0, 0, 0);::DwmSetWindowAttribute(hwnd, DWMWA_TEXT_COLOR,&titleTextColor, sizeof(titleTextColor));}}};if (!widget->isVisible()) {QTimer::singleShot(100, setColorFunc);}else {setColorFunc();}
}