开源控件:Qt/C++自定义异形窗口和颜色选择器 【工程源码联系博主索要】

ops/2024/11/20 10:16:03/

使用 Qt 和 C++ 实现一个异形窗口和自定义颜色选择器的过程。


在这里插入图片描述
在这里插入图片描述

1. CustomShapeWidgetUi

该类实现了一个具有自定义形状和颜色选择功能的窗口。

构造函数 CustomShapeWidgetUi
CustomShapeWidgetUi::CustomShapeWidgetUi(const QString &imagePath, QDialog *parent): QDialog(parent), backgroundPixmap(imagePath), ui(new Ui::CustomShapeWidgetUi)
{ui->setupUi(this);// 设置窗口无边框,透明背景setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);setAttribute(Qt::WA_TranslucentBackground);// 设置窗口形状setWindowShape(imagePath);resize(backgroundPixmap.size());  // 调整窗口大小为图片大小// 设置颜色选择器的响应connect(ui->colorPicker, &CustomColorPicker::colorChanged, [=](QColor color) {ui->colorEdit->setText(color.name());});// 设置关闭和确认按钮的功能connect(ui->cancelButton, &QToolButton::clicked, this, &QDialog::reject);connect(ui->okButton, &QToolButton::clicked, this, &QDialog::accept);
}
  • 无边框和透明背景Qt::FramelessWindowHint 移除窗口边框,Qt::WA_TranslucentBackground 设置背景透明,配合异形窗口实现。
  • 形状设置:调用 setWindowShape,根据图片的非透明区域设置窗口形状。
  • 颜色选择colorChanged 信号和槽函数更新 colorEdit 显示颜色的十六进制值。
  • 按钮功能:关闭按钮和确认按钮使用 rejectaccept 信号关闭对话框。
重写 paintEvent
void CustomShapeWidgetUi::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.drawPixmap(0, 0, backgroundPixmap);QWidget::paintEvent(event);  // 调用基类的 paintEvent 保持设计师元素的绘制
}

使用 QPainter 绘制背景图片,并调用基类的 paintEvent 保持其他 UI 元素的正常绘制。

setWindowShape 方法
void CustomShapeWidgetUi::setWindowShape(const QString &imagePath)
{QPixmap pixmap(imagePath);QRegion region;// 根据图片的透明区域生成 QRegionfor (int y = 0; y < pixmap.height(); ++y) {for (int x = 0; x < pixmap.width(); ++x) {if (QColor(pixmap.toImage().pixel(x, y)).alpha() > 0) {region += QRegion(x, y, 1, 1);}}}setMask(region);
}

这里通过遍历图片像素点,判断每个像素的透明度,以生成自定义窗口形状的 QRegion,并将该 QRegion 应用到窗口的遮罩 (setMask) 上。


2. CustomColorPicker

CustomColorPicker 类实现了一个自定义颜色选择器。

构造函数 CustomColorPicker
CustomColorPicker::CustomColorPicker(QWidget *parent): QWidget(parent), brightness(255), updatingBrightness(false)
{setFixedSize(220, 220);  // 设置控件大小color = QColor::fromHsv(0, 255, brightness);hueSatPoint = QPoint(0, height());
}
  • 固定大小:颜色选择器被设置为 220x220。
  • 初始颜色:默认颜色设置为最大亮度的红色,亮度设为 255。
  • 位置初始化hueSatPoint 定位到左下角。
paintEvent 方法
void CustomColorPicker::paintEvent(QPaintEvent *event)
{QPainter painter(this);// 绘制色相-饱和度选择区域QImage hueSatImage(width() - 30, height(), QImage::Format_RGB32);for (int x = 0; x < hueSatImage.width(); ++x) {for (int y = 0; y < hueSatImage.height(); ++y) {int hue = static_cast<int>((360.0 * x) / hueSatImage.width());int saturation = static_cast<int>((255.0 * (hueSatImage.height() - y)) / hueSatImage.height());QColor tempColor = QColor::fromHsv(hue, saturation, brightness);hueSatImage.setPixelColor(x, y, tempColor);}}painter.drawImage(0, 0, hueSatImage);// 绘制亮度滑条QLinearGradient gradient(0, 0, 0, height());gradient.setColorAt(0, QColor::fromHsv(color.hue(), color.saturation(), 255));gradient.setColorAt(1, QColor::fromHsv(color.hue(), color.saturation(), 0));painter.fillRect(width() - 20, 0, 20, height(), gradient);// 绘制选中点指示器painter.setPen(QPen(Qt::black, 2));painter.setBrush(Qt::NoBrush);painter.drawRect(hueSatPoint.x() - 10, hueSatPoint.y() - 10, 20, 20);// 绘制亮度滑条上的指示器int brightnessY = height() - (brightness * height() / 255);painter.drawRect(width() - 20, brightnessY - 5, 20, 10);
}
  • 色相-饱和度区域:通过 QImage 绘制 2D 色相-饱和度区域,亮度保持不变。
  • 亮度滑条:设置渐变颜色,用当前色相和饱和度生成亮度变化效果。
  • 指示器:指示器在色相-饱和度区域和亮度滑条上,展示当前选中的颜色。
鼠标事件处理
void CustomColorPicker::mousePressEvent(QMouseEvent *event) {if (event->x() < width() - 30) {hueSatPoint = event->pos();updatingBrightness = false;updateColorFromHueSat();} else {updatingBrightness = true;updateColorFromBrightness(event->y());}
}void CustomColorPicker::mouseMoveEvent(QMouseEvent *event) {if (event->buttons() & Qt::LeftButton) {if (updatingBrightness) {updateColorFromBrightness(event->y());} else if (event->x() < width() - 30) {hueSatPoint = event->pos();updateColorFromHueSat();}}
}
  • 点击:判断点击的位置,是色相-饱和度区域还是亮度滑条。
  • 拖动:在点击的区域内拖动时,更新相应的颜色。
更新颜色的方法
void CustomColorPicker::updateColorFromHueSat()
{int hue = static_cast<int>((360.0 * hueSatPoint.x()) / (width() - 30));int saturation = static_cast<int>((255.0 * (height() - hueSatPoint.y())) / height());hue = qBound(0, hue, 359);saturation = qBound(0, saturation, 255);color.setHsv(hue, saturation, brightness);emit colorChanged(color);update();
}void CustomColorPicker::updateColorFromBrightness(int y)
{brightness = qBound(0, 255 * (height() - y) / height(), 255);color.setHsv(color.hue(), color.saturation(), brightness);emit colorChanged(color);update();
}
  • 色相和饱和度更新:根据 hueSatPoint 计算色相和饱和度,确保其在合理范围内 (qBound)。
  • 亮度更新:根据鼠标在亮度滑条上的位置更新亮度。


http://www.ppmy.cn/ops/135207.html

相关文章

【GNU】addr2line

1、什么是addr2line addr2line 是 GNU Binutils 工具集中的一个命令行工具&#xff0c;用于将程序中的地址转换为源代码中的文件名和行号。它在调试和问题定位中非常有用&#xff0c;尤其是在处理崩溃或 core dump 时。 2、常用选项 选项功能-e <file>指定目标文件&am…

农村生活污水排水监测系统:助力乡村生态环境建设

在广袤的农村大地&#xff0c;清新的空气、绿色的田野和潺潺的溪流共同构成了美丽的乡村画卷。然而&#xff0c;随着农村经济的发展和生活水平的提高&#xff0c;农村生活污水的排放问题日益凸显&#xff0c;成为影响乡村生态环境的一个重要因素。为了有效解决这一问题&#xf…

全新UI H5购物商城系统存在前台任意文件上传漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

移动端web页面调用原生jsbridge的封装

为了统一android端和ios端调用原生jsbridge方法统一&#xff0c;且web端不需要使用callback方式接收回调&#xff0c;特封装了以下js工具类&#xff1a; // 全局回调管理器 window.CallbackManager {callbacks: new Map(),registerCallback: function (callbackId, callback)…

小程序-基于java+SpringBoot+Vue的小区服务管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

《深入理解 Spring MVC 工作流程》

一、Spring MVC 架构概述 Spring MVC 是一个基于 Java 的轻量级 Web 应用框架&#xff0c;它遵循了经典的 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将请求、响应和业务逻辑分离&#xff0c;从而构建出灵活可维护的 Web 应用程序。 在 Spring MV…

16. 清理Python包管理工具(pip 和 conda)的缓存和冗余文件

这个专栏记录我学习/科研过程中遇到的一些小问题以及解决方案&#xff0c;一些问题可能比较蠢请见谅。自用&#xff0c;仅供参考。 ------------------------------------------------------------------------------------ 清理Python包管理工具&#xff08;pip 和 conda&am…

CentOS 7.9 搭建本地Yum源

yum&#xff08;Yellow Dog Updater&#xff0c;Modified&#xff09;是一个在Fedora、Centos、RedHat中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖关系&#xff0c;并且一次安装所有依赖的软件…