QtGUI模块功能详细说明,颜色和外观(六)

目录 一. 窗口和屏幕管理 二. 绘图和渲染 三. 图像处理 四. 字体和文本 五. 事件和输入处理 六. OpenGL 和硬件加速 七. 颜色和外观 1、基础说明 1.1、QColor 的角色 1.2、QPalette

目录

一. 窗口和屏幕管理

二. 绘图和渲染

三. 图像处理

四. 字体和文本

五. 事件和输入处理

六. OpenGL 和硬件加速

七. 颜色和外观

1、基础说明

1.1、QColor 的角色

1.2、QPalette 的角色

1.3、QColor 和 QPalette 的分工与协作

2、QColor: 颜色表示

2.1、QColor 简介

2.2、颜色模型

2.2.1、RGB (Red, Green, Blue)

2.2.2、HSV (Hue, Saturation, Value)

2.2.3、CMYK (Cyan, Magenta, Yellow, Key/Black)

2.2.4、HSL (Hue, Saturation, Lightness)

2.3、其他颜色表示与创建方式

2.4、颜色操作与转换

2.5、QColor 应用

3、QPalette: 颜色方案管理

3.1、QPalette 简介

3.2、颜色组 (QPalette::ColorGroup)

3.3、颜色角色 (QPalette::ColorRole)

3.4、QPalette 的创建与设置

3.5、QPalette 的查询

3.6、QPalette 与 Qt 样式表 (Style Sheets) 的关系

4、示例代码

4.1、使用 QColor 设置按钮背景颜色

4.2、使用 QPalette 设置窗口背景和文本颜色

4.3、使用 QPalette 动态切换按钮颜色

4.4、使用 QColor 和 QPalette 设置复杂控件样式

八. 图标和光标

九. 平台和渲染后端

十. 国际化(GUI 相关)


一. 窗口和屏幕管理

请跳转章节,此处不再重复:QtGUI模块功能详细说明,窗口和屏幕管理(一)

二. 绘图和渲染

 请跳转章节,此处不再重复:QtGUI模块功能详细说明,图形绘制与渲染(二)

三. 图像处理

 请跳转章节,此处不再重复:QtGUI模块功能详细说明,图像处理(三)

四. 字体和文本

 请跳转章节,此处不再重复:QtGUI模块功能详细说明, 字体和文本渲染(四)

五. 事件和输入处理

 请跳转章节,此处不再重复:QtGUI模块功能详细说明,事件与输入处理(五)

六. OpenGL 和硬件加速

支持 OpenGL 和 Vulkan 渲染,适用于高性能图形,暂不说明。

七. 颜色和外观

在 Qt 应用程序的开发中,颜色与外观是用户界面 (UI) 设计的核心组成部分,直接影响用户体验、视觉吸引力和功能清晰度。

1、基础说明

在 Qt 中,QColor 和 QPalette 是颜色管理的两大核心类,它们在功能和使用场景上各有侧重,协同工作以实现灵活的颜色控制。

1.1、QColor 的角色

QColor 是一个基础类,用于表示和操作单个颜色。它提供了对颜色值的精确控制,适用于需要直接指定颜色的场景。

  • 支持多种颜色表示方式,包括 RGB、HSV、CMYK 和十六进制(如 #FF0000)。

  • 提供颜色操作方法,如调整亮度、饱和度、透明度(Alpha 通道)等。

  • 支持颜色名称(如 "red"、"blue")和跨平台颜色一致性。

  • 可以查询颜色的属性(如 red()、green()、blue() 或 hue()、saturation())。

使用场景:

  • 直接设置控件颜色:例如,通过 QWidget::setStyleSheet() 或 QPainter 设置背景色、前景色等。

    QWidget widget;
    widget.setStyleSheet("background-color: #FF5733;");
  • 动态生成颜色:在需要根据条件计算颜色时使用,例如渐变色或基于用户输入的颜色。

    QColor color(255, 87, 51); // RGB 红色
    color.setHsv(30, 200, 255); // 转换为 HSV 模型
  • 绘制图形:在 QPainter 中用于绘制形状、线条或填充区域。

    QPainter painter(this);
    painter.setPen(QColor(0, 128, 255));
    painter.drawLine(0, 0, 100, 100);

1.2、QPalette 的角色

QPalette 是一个更高级的类,用于管理控件或应用程序的颜色集合(调色板),它定义了不同控件状态和角色的颜色(如前景、背景、选中状态等)。

  • 提供一组颜色角色(ColorRole),如 Window(窗口背景)、Text(文本颜色)、Button(按钮背景)等。

  • 支持三种状态(ColorGroup):Active(活动)、Inactive(非活动)、Disabled(禁用)。

  • 允许为不同角色和状态设置独立的 QColor 值,形成完整的颜色方案。

  • 支持动态切换调色板,例如实现明暗主题或响应系统主题变化。

使用场景:

  • 全局外观管理:通过设置应用程序的调色板,确保所有控件遵循统一的颜色方案。

    QPalette palette = qApp->palette();
    palette.setColor(QPalette::Window, QColor(53, 53, 53)); // 深色背景
    palette.setColor(QPalette::Text, Qt::white); // 白色文本
    qApp->setPalette(palette);
  • 控件特定调色板:为单个控件自定义颜色,而不影响全局。

    QWidget widget;
    QPalette palette = widget.palette();
    palette.setColor(QPalette::Button, QColor(100, 149, 237));
    widget.setPalette(palette);
  • 主题切换:通过替换 QPalette 实现明暗主题或自定义主题。

    QPalette darkPalette;
    darkPalette.setColor(QPalette::Window, QColor(30, 30, 30));
    darkPalette.setColor(QPalette::WindowText, Qt::white);
    qApp->setPalette(darkPalette); // 切换到暗主题
  • 状态反馈:为不同状态(如禁用按钮)设置不同颜色,提升交互清晰度。

    palette.setColor(QPalette::Disabled, QPalette::ButtonText, Qt::gray);

1.3、QColor 和 QPalette 的分工与协作

QColor 是底层的颜色表示工具,专注于单个颜色的定义和操作,适合直接绘制或局部颜色设置。

QPalette 是高层的颜色管理工具,负责组织和应用一组颜色到控件或应用程序,适合全局或状态相关的颜色管理。

协作:

  • QPalette 使用 QColor 来定义每个角色和状态的具体颜色。

    QPalette palette;
    palette.setColor(QPalette::Window, QColor(200, 200, 200));
  • 开发者可以先用 QColor 计算或生成颜色,再将其应用到 QPalette 中。例如,动态生成渐变色后更新调色板。

  • 在复杂场景中,QPalette 提供全局一致性,而 QColor 提供细粒度的颜色调整。例如,通过 QPalette 设置按钮的默认颜色,再用 QColor 通过样式表微调特定按钮的外观。

实际开发中的选择:

  • 如果只需要设置单一控件的颜色(如背景或文本),直接使用 QColor 和样式表更简单。

  • 如果需要管理整个应用程序的颜色方案或支持主题切换,使用 QPalette 更高效。

  • 混合使用两者可以实现灵活的颜色管理,例如用 QPalette 设置默认主题,再用 QColor 动态调整特定控件。

2、QColor: 颜色表示

2.1、QColor 简介

QColor 是 Qt 框架中用于表示和操作颜色的核心类,广泛应用于图形绘制、界面样式设置和颜色管理。它支持多种颜色模型(如 RGB、HSV、CMYK、HSL),并提供丰富的功能来创建、查询、修改和转换颜色。

基本构造与修改

QColor color; // 默认构造,无效颜色 (isValid() 返回 false)
QColor red(255, 0, 0); // RGB 构造函数
QColor blue(Qt::blue); // 使用 Qt::GlobalColor 枚举
QColor green("#00FF00"); // 十六进制字符串
QColor cyan("cyan"); // 颜色名称

QColor original(255, 0, 0);
QColor modified = original; // 复制
modified.setRgb(0, 255, 0); // 修改副本,原对象不变

2.2、颜色模型

QColor 支持多种颜色模型,每种模型适合不同的使用场景。

2.2.1、RGB (Red, Green, Blue)

原理与加法混色:

  • RGB 是一种加法混色模型,基于红 (Red)、绿 (Green)、蓝 (Blue) 三原色的组合,广泛用于显示器和数字设备。

  • 每种分量的值范围为 0 到 255(整数)或 0.0 到 1.0(浮点),通过叠加形成不同颜色。

  • 例如:(255, 0, 0) 为纯红,(255, 255, 255) 为白色,(0, 0, 0) 为黑色。

通过整数/浮点分量创建、查询与设置:

  • 创建:

    QColor color(255, 128, 0); // 整数 RGB (橙色)
    color.setRgbF(1.0, 0.5, 0.0); // 浮点 RGB
  • 查询:

    int r = color.red(); // 返回 255
    float rf = color.redF(); // 返回 1.0
  • 设置:

    color.setRgb(0, 255, 0); // 设置为绿色
    color.setRed(128); // 单独修改红色分量
  • 透明度 (Alpha) 通道:

    • Alpha 通道表示颜色的透明度,范围为 0(完全透明)到 255(完全不透明)。

    • 创建带 Alpha 的颜色:

      QColor semiTransparent(255, 0, 0, 128); // 半透明红色
      color.setAlpha(64); // 设置 Alpha 为 1/4 透明
    • 查询 Alpha:

      int alpha = color.alpha(); // 返回 128
      float alphaF = color.alphaF(); // 返回 0.5
2.2.2、HSV (Hue, Saturation, Value)

原理与人类感知:

  • HSV 模型基于人类对颜色的感知,分为色相 (Hue)、饱和度 (Saturation) 和明度 (Value)

  • 色相 (Hue):表示颜色类型(如红、蓝),范围为 0 到 359 度。

  • 饱和度 (Saturation):表示颜色的纯度,0(灰色)到 255(纯色)。

  • 明度 (Value):表示亮度,0(黑色)到 255(最亮)。

  • HSV 适合需要调整颜色亮度或饱和度的场景,如主题生成或颜色选择器。

通过色相、饱和度、明度创建、查询与设置:

  • 创建:

    QColor color;
    color.setHsv(120, 255, 255); // 纯绿色 (色相 120°)
    color.setHsvF(0.333, 1.0, 1.0); // 浮点 HSV
  • 查询:

    int hue = color.hue(); // 返回 120
    int saturation = color.saturation(); // 返回 255
    int value = color.value(); // 返回 255
  • 设置:

    color.setHsv(240, 128, 255); // 设置为淡蓝色
2.2.3、CMYK (Cyan, Magenta, Yellow, Key/Black)

原理与减法混色(主要用于印刷):

  • CMYK 是一种减法混色模型,基于青 (Cyan)、品红 (Magenta)、黄 (Yellow) 和黑 (Key/Black),主要用于印刷。

  • 每种分量范围为 0 到 255(整数)或 0.0 到 1.0(浮点)。

  • 黑色 (Key) 用于增强深色效果,减少三色墨水的使用。

通过青、品红、黄、黑分量创建、查询与设置:

  • 创建:

    QColor color;
    color.setCmyk(255, 0, 0, 0); // 纯青色
    color.setCmykF(1.0, 0.0, 0.0, 0.0); // 浮点 CMYK
  • 查询:

    int cyan = color.cyan(); // 返回 255
    float magentaF = color.magentaF(); // 返回 0.0
  • 设置:

    color.setCmyk(0, 255, 255, 0); // 设置为品红+黄色混合
2.2.4、HSL (Hue, Saturation, Lightness)

原理与人类感知(亮度):

  • HSL 模型类似于 HSV,但使用亮度 (Lightness) 替代明度 (Value),更符合人类对亮度的感知。

  • 色相 (Hue):同 HSV,0 到 359 度。

  • 饱和度 (Saturation):0(灰色)到 255(纯色)。

  • 亮度 (Lightness):0(黑色)到 255(白色),128 为中等亮度。

  • HSL 适合需要调整亮度而不改变色调的场景。

通过色相、饱和度、亮度创建、查询与设置:

  • 创建:

    QColor color;
    color.setHsl(60, 255, 128); // 亮黄色
    color.setHslF(0.167, 1.0, 0.5); // 浮点 HSL
  • 查询:

    int hue = color.hslHue(); // 返回 60
    int saturation = color.hslSaturation(); // 返回 255
    int lightness = color.lightness(); // 返回 128
  • 设置:

    color.setHsl(180, 128, 128); // 设置为淡青色

2.3、其他颜色表示与创建方式

2.3.1、预定义颜色名称(如 "red", "blue", "darkgray")

Qt 支持标准的 SVG 颜色名称(如 "red"、"blue"、"darkgray"),这些名称对应固定的 RGB 值。

  • 颜色名称对大小写不敏感。

  • 无效名称会导致 isValid() 返回 false。

QColor color("purple"); // 设置为紫色
color.setNamedColor("darkcyan"); // 设置为深青色

2.3.2、十六进制字符串(如 "#RRGGBB", "#AARRGGBB")

支持标准的 HTML 十六进制格式:

  • #RRGGBB:6 位表示 RGB(如 #FF0000 为红色)。

  • #AARRGGBB:8 位表示带透明度的 RGB(如 #80FF0000 为半透明红色)。

QColor color("#FF5733"); // 橙色
color.setNamedColor("#8000FF00"); // 半透明绿色

2.3.3、Qt::GlobalColor 枚举(如 Qt::red, Qt::black)

Qt 提供一组预定义的全局颜色枚举 (Qt::GlobalColor),如 Qt::red、Qt::black、Qt::transparent。

QColor color(Qt::darkBlue); // 深蓝色
color = Qt::yellow; // 黄色

2.4、颜色操作与转换

2.4.1、亮度调整 (lighter(), darker())

  • lighter(factor):使颜色变亮,factor 为百分比(默认 150 表示 1.5 倍亮度)。

  • darker(factor):使颜色变暗,factor 为百分比(默认 200 表示 0.5 倍亮度)。

  • 返回新 QColor 对象,原对象不变。

QColor color(100, 100, 100); // 中灰色
QColor lighterColor = color.lighter(150); // 更亮的灰色
QColor darkerColor = color.darker(200); // 更暗的灰色

2.4.2、颜色模型间转换 (toRgb(), toHsv(), toCmyk(), toHsl())

QColor 支持在不同颜色模型间转换,返回等效的新 QColor 对象。

  • 转换可能因模型差异导致轻微精度损失(如 CMYK 到 RGB)。

  • Alpha 通道在转换中保留。

QColor color(255, 0, 0); // 红色 (RGB)
QColor hsvColor = color.toHsv(); // 转换为 HSV
QColor cmykColor = color.toCmyk(); // 转换为 CMYK
QColor hslColor = color.toHsl(); // 转换为 HSL

2.4.3、有效性判断 (isValid())

检查 QColor 对象是否有效(即是否正确初始化)。在解析用户输入(如颜色名称或十六进制字符串)时,检查有效性以避免错误。

QColor color; // 默认构造,无效
bool valid = color.isValid(); // 返回 false
color.setRgb(255, 0, 0);
valid = color.isValid(); // 返回 true

2.5、QColor 应用

2.5.1、在 QPainter 中直接使用颜色

void MyWidget::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    painter.setBrush(QColor(255, 100, 100)); // 浅红色填充
    painter.setPen(QColor("#0000FF")); // 蓝色边框
    painter.drawRect(50, 50, 100, 100);
}

2.5.2、作为属性值设置(如 setStyleSheet)

  • 设置按钮背景和文本颜色:

    QPushButton button("Click Me");
    button.setStyleSheet("background-color: #FF5733; color: white;"); // 橙色背景,白色文本
  • 或者使用 QColor 动态生成样式表:

    QColor bgColor(100, 149, 237); // 浅蓝色
    QColor textColor(Qt::white);
    button.setStyleSheet(QString("background-color: %1; color: %2;")
                        .arg(bgColor.name()).arg(textColor.name()));

3、QPalette: 颜色方案管理

3.1、QPalette 简介

QPalette 是 Qt 框架中用于管理控件和应用程序颜色方案的类,通过为不同控件状态和角色定义颜色集合,实现统一的 UI 外观和主题化支持。

  • QPalette 是一个颜色调色板,包含多个颜色角色(ColorRole)和颜色组(ColorGroup)的颜色定义。

  • 每个颜色角色对应 UI 元素的一个特定部分(如窗口背景、按钮文本),每个颜色组对应控件的状态(如活动、禁用)。

  • 根据控件状态(启用、禁用、选中等)动态应用不同颜色,提升交互反馈。

3.1.1、部件调色板的继承机制

  • 应用程序启动时,Qt 根据操作系统和桌面环境的主题初始化全局调色板(QApplication::palette())。

  • 每个部件默认继承应用程序的调色板,除非显式设置了自定义调色板。

  • 如果部件未设置自己的调色板,它会使用父部件的调色板;若父部件也没有,则回溯至应用程序级调色板。

QWidget parent;
QPalette parentPalette;
parentPalette.setColor(QPalette::Window, Qt::darkGray);
parent.setPalette(parentPalette); // 父部件设置灰色背景
QWidget child(&parent); // 子部件继承父部件的调色板

3.1.2、自定义调色板:

  • 部件可以通过 setPalette() 设置自己的调色板,覆盖继承的调色板。

  • 自定义调色板仅影响该部件及其子部件,不影响父部件或全局调色板。

注意:

  • 调色板继承是静态的,父部件调色板的变化不会自动传播到子部件,除非子部件显式重新获取父调色板。

  • 全局调色板的变化(如 QApplication::setPalette())会影响所有未自定义调色板的部件。

3.2、颜色组 (QPalette::ColorGroup)

QPalette::ColorGroup 枚举定义了控件的三种状态,用于区分不同交互场景下的颜色:

  • QPalette::Active:控件处于活动状态(焦点或用户交互中)。

  • QPalette::Inactive:控件处于非活动状态(无焦点但可交互)。

  • QPalette::Disabled:控件被禁用,无法交互。

  • QPalette::Normal:别名,等同于 Active,用于简化代码(不推荐使用,因可能导致歧义)。

QPalette::Active

控件被用户激活(如获得焦点、被点击或悬停),适用于活动窗口的按钮、文本框或选中项。

palette.setColor(QPalette::Active, QPalette::Button, Qt::blue);

QPalette::Inactive

控件可交互但未被激活(如窗口失去焦点),适用于非活动窗口的控件,通常颜色较暗淡以示区别。

palette.setColor(QPalette::Inactive, QPalette::WindowText, Qt::darkGray);

QPalette::Disabled

控件被禁用(setEnabled(false)),不可交互,适用于禁用按钮、文本框等,通常使用灰色或低对比度颜色以示不可用。

palette.setColor(QPalette::Disabled, QPalette::ButtonText, Qt::gray);

3.3、颜色角色 (QPalette::ColorRole)

QPalette::ColorRole 枚举定义了 UI 元素的具体用途(如背景、文本),每个角色对应一种颜色或画刷(QBrush)。主要角色包括文本、背景、3D 效果、链接和工具提示等。

3.3.1、文本角色:

WindowText:

  • 用途:窗口或控件上的一般文本(如标签 QLabel 的文本)。

  • 典型应用:确保与 Window 背景高对比度(如黑色文本配白色背景)。

Text:

  • 用途:可编辑控件(如 QLineEdit、QTextEdit)的输入文本。

  • 典型应用:输入框中的用户输入文本,通常与 Base 背景搭配。

ButtonText:

  • 用途:按钮(如 QPushButton)上的文本。

  • 典型应用:按钮文本颜色,通常与 Button 背景形成对比。

BrightText:

  • 用途:需要高亮的文本(如警告或强调文本)。

  • 典型应用:错误提示或夜间模式下的高亮文本。

HighlightedText:

  • 用途:选中项的文本(如列表或表格中的选中行文本)。

  • 典型应用:与 Highlight 背景搭配,确保选中项文本清晰可见。

PlaceholderText:

  • 用途:输入框的占位符文本(如 QLineEdit 的提示文本)。

  • 典型应用:通常为浅色(如灰色),以区分实际输入文本。

3.3.2、背景角色:

Window:

  • 用途:窗口或控件的背景(如 QWidget 的背景)。

  • 典型应用:主窗口或对话框的整体背景色。

Base:

  • 用途:可编辑控件的背景(如 QLineEdit、QTextEdit)。

  • 典型应用:输入框背景,通常为白色或浅色以便输入文本清晰。

Button:

  • 用途:按钮的背景(如 QPushButton)。

  • 典型应用:按钮的默认背景,需与 ButtonText 形成对比。

Highlight:

  • 用途:选中项的背景(如列表、表格或输入框的选中区域)。

  • 典型应用:高亮选中行或文本区域,通常为亮色(如蓝色)。

ToolTipBase:

  • 用途:工具提示(QToolTip)的背景。

  • 典型应用:工具提示背景,通常为浅黄色或浅灰色。

3.3.3、3D 效果角色:

  • Light:用于控件的高光部分(如按钮的亮边)。

  • Midlight:高光和正常背景之间的过渡色。

  • Dark:用于控件的阴影部分(如按钮的暗边)。

  • Mid:介于正常和阴影之间的颜色。

  • Shadow:最暗的阴影色,用于立体效果。

  • 典型应用:这些角色共同实现按钮、滚动条等的 3D 视觉效果,增强控件立体感。

3.3.4、链接角色:

  • Link:未访问链接的颜色(通常为蓝色)。

  • LinkVisited:已访问链接的颜色(通常为紫色)。

  • 典型应用:用于 QTextBrowser 或富文本中的超链接。

3.3.5、工具提示角色:

  • ToolTipText:工具提示的文本颜色。

  • 典型应用:与 ToolTipBase 搭配,确保工具提示文本可读。

3.4、QPalette 的创建与设置

3.4.1、获取默认调色板(应用程序级、部件级)

  • 应用程序级调色板:使用 QApplication::palette() 获取全局默认调色板。示例:

    QPalette appPalette = QApplication::palette();
  • 部件级调色板:使用 QWidget::palette() 获取部件当前调色板(可能是继承的)。

    QWidget widget;
    QPalette widgetPalette = widget.palette();

3.4.2、修改调色板颜色

  • setColor(ColorGroup group, ColorRole role, const QColor &color):为特定颜色组和角色设置颜色。

    QPalette palette;
    palette.setColor(QPalette::Active, QPalette::Window, Qt::darkGray);
    palette.setColor(QPalette::Disabled, QPalette::ButtonText, Qt::gray);
  • setColor(ColorRole role, const QColor &color):为所有颜色组的指定角色设置相同颜色。

    palette.setColor(QPalette::WindowText, Qt::black); // 所有状态的窗口文本为黑色
  • setBrush(ColorGroup group, ColorRole role, const QBrush &brush):为角色设置画刷,支持颜色、渐变或纹理填充。

    QLinearGradient gradient(0, 0, 100, 100);
    gradient.setColorAt(0, Qt::white);
    gradient.setColorAt(1, Qt::blue);
    palette.setBrush(QPalette::Window, QBrush(gradient));

3.4.3、将调色板应用于部件

  • QWidget::setPalette(const QPalette &palette):为特定部件设置调色板,覆盖继承的调色板。

    QWidget widget;
    QPalette palette;
    palette.setColor(QPalette::Window, Qt::darkBlue);
    widget.setPalette(palette);
  • QWidget::setAutoFillBackground(bool) 的重要性:默认情况下,Qt 部件不自动填充背景,需启用 setAutoFillBackground(true) 才能应用 QPalette::Window 的背景色。

    widget.setAutoFillBackground(true); // 启用背景填充
    widget.setPalette(palette);

全局应用:使用 QApplication::setPalette() 设置全局调色板,影响所有未自定义调色板的部件。

3.5、QPalette 的查询

  • color(ColorGroup group, ColorRole role):查询特定颜色组和角色的颜色。

    QPalette palette = widget.palette();
    QColor windowColor = palette.color(QPalette::Active, QPalette::Window);
  • brush(ColorGroup group, ColorRole role):查询特定颜色组和角色的画刷(可能包含颜色、渐变等)。

    QBrush windowBrush = palette.brush(QPalette::Active, QPalette::Window);
    QColor color = windowBrush.color(); // 获取画刷的颜色

3.6、QPalette 与 Qt 样式表 (Style Sheets) 的关系

优先级:

样式表 (QSS) 的优先级高于 QPalette,即通过 setStyleSheet() 设置的颜色会覆盖 QPalette 的设置。

作用范围:

QPalette 适合全局或部件级的颜色管理,影响所有相关的颜色角色和状态。样式表更灵活,适合针对特定控件或伪状态(如 :hover、:disabled)进行细粒度样式设置。

3.6.1、何时选择使用 QPalette,何时选择使用样式表

使用 QPalette:

  • 需要统一管理整个应用程序或多个控件的颜色方案(如主题切换)。

  • 需要为不同状态(Active、Disabled 等)定义一致的颜色。

  • 需要与 Qt 的样式系统(如 QStyle)深度集成。

使用样式表:

  • 需要为特定控件或伪状态设置复杂的样式(如渐变、边框、悬停效果)。

  • 需要快速调整少量控件的样式,而不影响全局。

  • 需要使用 CSS 风格的灵活语法。

4、示例代码

4.1、使用 QColor 设置按钮背景颜色

  • QColor(255, 100, 100) 创建一个红色为主的 RGB 颜色。

  • 使用 setStyleSheet 通过 color.name() 设置按钮背景颜色(返回十六进制,如 #ff6464)。

#include <QApplication>
#include <QPushButton>
#include <QColor>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建按钮
    QPushButton button("Click Me");
    button.setFixedSize(200, 50);

    // 使用 QColor 设置背景颜色
    QColor color(255, 100, 100); // RGB: 红色
    button.setStyleSheet(QString("background-color: %1;").arg(color.name()));

    button.show();
    return app.exec();
}

4.2、使用 QPalette 设置窗口背景和文本颜色

  • QPalette::Window 设置窗口背景颜色为深灰色。

  • QPalette::WindowText 设置文本颜色为白色。

  • setPalette 将调色板应用到整个窗口。

#include <QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QPalette>
#include <QColor>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建主窗口
    QMainWindow window;
    window.setWindowTitle("QPalette Example");
    window.resize(300, 200);

    // 创建标签
    QLabel *label = new QLabel("Hello, QPalette!", &window);
    label->move(100, 80);

    // 设置 QPalette
    QPalette palette;
    palette.setColor(QPalette::Window, QColor(50, 50, 50)); // 深灰色背景
    palette.setColor(QPalette::WindowText, Qt::white);      // 白色文本
    window.setPalette(palette);

    window.show();
    return app.exec();
}

4.3、使用 QPalette 动态切换按钮颜色

  • 创建两个 QPalette 对象,分别设置绿色和红色按钮背景。

  • 通过按钮点击信号切换调色板,实现颜色动态变化。

  • QPalette::Button 控制按钮的背景颜色。

#include <QApplication>
#include <QPushButton>
#include <QPalette>
#include <QColor>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建按钮
    QPushButton button("Toggle Color");
    button.setFixedSize(200, 50);

    // 创建两个 QPalette
    QPalette palette1, palette2;
    palette1.setColor(QPalette::Button, QColor(100, 200, 100)); // 绿色
    palette2.setColor(QPalette::Button, QColor(200, 100, 100)); // 红色

    bool isPalette1 = true;

    // 连接按钮点击信号以切换调色板
    QObject::connect(&button, &QPushButton::clicked, [&]() {
        button.setPalette(isPalette1 ? palette2 : palette1);
        isPalette1 = !isPalette1;
    });

    button.show();
    return app.exec();
}

4.4、使用 QColor 和 QPalette 设置复杂控件样式

  • QPalette::Base 设置文本编辑框的背景颜色(浅灰色)。

  • QPalette::Text 设置输入文本颜色(深蓝色)。

  • QPalette::Highlight 和 QPalette::HighlightedText 控制选中文字的背景和前景色。

#include <QApplication>
#include <QMainWindow>
#include <QTextEdit>
#include <QPalette>
#include <QColor>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建主窗口
    QMainWindow window;
    window.setWindowTitle("Complex QPalette Example");
    window.resize(400, 300);

    // 创建文本编辑框
    QTextEdit *textEdit = new QTextEdit(&window);
    textEdit->setGeometry(50, 50, 300, 200);

    // 设置 QPalette
    QPalette palette;
    palette.setColor(QPalette::Base, QColor(240, 240, 240));    // 文本框背景
    palette.setColor(QPalette::Text, QColor(0, 0, 128));        // 文本颜色
    palette.setColor(QPalette::Highlight, QColor(0, 120, 215)); // 高亮背景
    palette.setColor(QPalette::HighlightedText, Qt::red);     // 高亮文本
    textEdit->setPalette(palette);

    window.show();
    return app.exec();
}

八. 图标和光标

支持图标和鼠标光标管理。

  • QIcon: 图标管理,支持多分辨率和状态。

  • QCursor: 鼠标光标样式和自定义形状。

  • QIconEngine: 自定义图标渲染引擎。

九. 平台和渲染后端

提供平台特定集成和渲染后端支持。

  • QPlatformIntegration: 平台特定的窗口系统集成(Windows、X11、Wayland 等)。

  • QRasterPaintEngine: 软件光栅化渲染引擎。

  • QPlatformSurface: 平台特定的渲染表面。

  • QPlatformTheme: 平台主题(如按钮样式、对话框风格)。

  • QPlatformGraphicsBuffer: 平台特定的图形缓冲区。

  • QPlatformSharedGraphicsCache: 共享图形缓存,加速渲染。

十. 国际化(GUI 相关)

支持 GUI 相关的字符编码和区域设置。

  • QTextCodec(部分):字符编码支持(仅限 GUI 文本显示)。

  • QLocale(部分):区域设置(仅限 GUI 格式,如日期、数字显示)。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754948912a5219616.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信