Qt环形颜色选择控件, 圆环颜色选择器

news2024/11/17 12:48:59

参考文章Qt编写自定义控件:环形颜色选择控件_qconicalgradient圆环渐变-CSDN博客

感谢作责提供的方法,下面程序的基础思路同参考文章。

为了更方便使用,这个选择器是基于64色表的,会显示选中的索引和色值。颜色选择时计算方式也有所不同。

选择器是逆时针的,先将64色填入渐变。通过根据小原型的位置,计算出角度,然后计算出它占360度的百分比,然后算出对应的索引,通过索引获得颜色,然后通知出去。

代码如下:

#include <QList>
#include <QColor>

const QList<QColor> listColor{
    QColor(0x72, 0x70, 0x1C),   //0
    QColor(0x6B, 0x72, 0x23),
    QColor(0x57, 0x76, 0x32),
    QColor(0x57, 0x6D, 0x3B),
    QColor(0x49, 0x61, 0x55),
    QColor(0x4B, 0x51, 0x63),
    QColor(0x46, 0x32, 0x87),
    QColor(0x3F, 0x12, 0xAE),   //7

    QColor(0x3F, 0x00, 0xC0),   //8
    QColor(0x5B, 0x0C, 0x98),
    QColor(0x68, 0x1D, 0x7A),
    QColor(0x7A, 0x36, 0x4F),
    QColor(0x8A, 0x20, 0x55),
    QColor(0x9C, 0x1E, 0x45),
    QColor(0xA7, 0x07, 0x51),
    QColor(0xB9, 0x13, 0x33),

    QColor(0xD1, 0x1E, 0x20),   //16
    QColor(0xC0, 0x2C, 0x13),
    QColor(0xDF, 0x13, 0x0D),
    QColor(0xFF, 0x00, 0x00),
    QColor(0xFD, 0x02, 0x00),
    QColor(0xFB, 0x02, 0x02),
    QColor(0xF1, 0x02, 0x0C),
    QColor(0xDB, 0x19, 0x0B),

    QColor(0xE4, 0x01, 0x1A),   //24
    QColor(0xC9, 0x06, 0x30),
    QColor(0x9D, 0x03, 0x5F),
    QColor(0x78, 0x06, 0x81),
    QColor(0x61, 0x04, 0x9A),
    QColor(0x48, 0x06, 0xB1),
    QColor(0x34, 0x03, 0xC8),
    QColor(0x2C, 0x05, 0xCF),

    QColor(0x24, 0x02, 0xD9),   //32
    QColor(0x00, 0x00, 0xFF),
    QColor(0x17, 0x01, 0xE7),
    QColor(0x1F, 0x01, 0xDF),
    QColor(0x20, 0x0F, 0xD0),
    QColor(0x30, 0x44, 0x8b),
    QColor(0x33, 0x78, 0x54),
    QColor(0x3A, 0x86, 0x3F),

    QColor(0x14, 0x82, 0x69),   //40
    QColor(0x18, 0x9B, 0x4C),
    QColor(0x0A, 0xBB, 0x3A),
    QColor(0x06, 0xE0, 0x19),
    QColor(0x1F, 0xC3, 0x1D),
    QColor(0x37, 0xB2, 0x16),
    QColor(0x1D, 0xDB, 0x08),
    QColor(0x00, 0xFF, 0x00),

    QColor(0x0F, 0xEE, 0x02),   //48
    QColor(0x34, 0xC9, 0x02),
    QColor(0x5D, 0xA0, 0x02),
    QColor(0x8D, 0x71, 0x01),
    QColor(0xA6, 0x58, 0x01),
    QColor(0xB9, 0x46, 0x00),
    QColor(0xD7, 0x28, 0x33),
    QColor(0xC9, 0x33, 0x03),
    
    QColor(0xDF, 0x1B, 0x05),   //56
    QColor(0xD5, 0x25, 0x05),
    QColor(0xC5, 0x35, 0x05),
    QColor(0xB0, 0x45, 0x0A),
    QColor(0x96, 0x5F, 0x0A),
    QColor(0x8A, 0x66, 0x0F),
    QColor(0x82, 0x6A, 0x13),
    QColor(0x7C, 0x6C, 0x18)    //63
};  //0-63(64色)
#ifndef COLORSELECTIONCIRCLE_H
#define COLORSELECTIONCIRCLE_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class ColorSelectionCircle; }
QT_END_NAMESPACE

class ColorSelectionCircle : public QWidget
{
    Q_OBJECT

public:
    ColorSelectionCircle(QWidget *parent = nullptr);
    ~ColorSelectionCircle();

protected:
    void paintEvent(QPaintEvent *event)override;
    void mousePressEvent(QMouseEvent *event)override;
    void mouseReleaseEvent(QMouseEvent *event)override;
    void mouseMoveEvent(QMouseEvent *event)override;
    void showEvent(QShowEvent *event) override;

signals:
    void ColorInfo(int index, QColor color);


private:
    qreal ballAngle{0};
    bool isPressed{false};
    void getColorInWidget(const QPoint &pos);
    QColor selectColor;//
   
    int m_index{0};

private:
    Ui::ColorSelectionCircle *ui;
};
#endif // COLORSELECTIONCIRCLE_H
#include "colorselectioncircle.h"
#include "ui_colorselectioncircle.h"
#include <QPaintEvent>
#include <QPainterPath>
#include <QDebug>
#include <QtMath>
#include <QGuiApplication>
#include <QScreen>
#include <QPainter>
#include "commondata.h"

ColorSelectionCircle::ColorSelectionCircle(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::ColorSelectionCircle)
{
    ui->setupUi(this);
    setPalette(Qt::white);
    setMinimumSize(150, 150);


}

ColorSelectionCircle::~ColorSelectionCircle()
{
    delete ui;
}

void ColorSelectionCircle::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        auto pressPos = event->pos();
        QPoint centerPoint = rect().center();
        
        ballAngle = -atan2(pressPos.y() - centerPoint.y(), pressPos.x() - centerPoint.x()) * (180 / M_PI);
        
        if(ballAngle < 0)
        {
            ballAngle = ballAngle + 360;
        }

        auto tmpballAngle = ((int)(ballAngle + 360.0 / listColor.size() / 2)) % 360 ;
        m_index = tmpballAngle / 360.0 * listColor.size();
        
        isPressed = true;
        emit ColorInfo(m_index, listColor[m_index]);
        update();
    }
    QWidget::mousePressEvent(event);
}

void ColorSelectionCircle::mouseReleaseEvent(QMouseEvent *event)
{
    if (isPressed)
    {
        isPressed = false;
    }
    return QWidget::mouseReleaseEvent(event);
}

void ColorSelectionCircle::mouseMoveEvent(QMouseEvent* event)
{
    if (isPressed)
    {
        auto nowPos = event->pos();
        QPoint centerPoint = rect().center();
        ballAngle = -atan2(nowPos.y() - centerPoint.y(), nowPos.x() - centerPoint.x()) * (180 / M_PI);
        //qDebug()<<"ballAngle:"<<ballAngle;
        if(ballAngle < 0)
        {
            ballAngle = ballAngle + 360;
        }
        auto tmpballAngle = ((int)(ballAngle + 360.0 / listColor.size() / 2))%360 ;
        

        //qDebug()<<"ballAngle after:"<<tmpballAngle;
        
        m_index = tmpballAngle / 360.0 * listColor.size();

        emit ColorInfo(m_index, listColor[m_index]);
        update();
    }
    return QWidget::mouseMoveEvent(event);
}

void ColorSelectionCircle::showEvent(QShowEvent *event)
{
    emit ColorInfo(m_index, listColor[m_index]);
    update();
    return QWidget::showEvent(event);
}

void ColorSelectionCircle::getColorInWidget(const QPoint &pos)
{
    static QScreen *screen = QGuiApplication::screenAt(pos);
    if (!screen)
    {
        screen = QGuiApplication::primaryScreen();
    }
    auto gpos = mapToGlobal(pos);
    selectColor = screen->grabWindow(0, gpos.x(), gpos.y(), 1, 1).toImage().pixel(0, 0);
}

void ColorSelectionCircle::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::transparent);

    auto rect = event->rect();
    auto standardLength = std::min(rect.width(), rect.height());
    auto radius = standardLength / 2 - standardLength * 0.1;
    QConicalGradient conicalGradient(0, 0, 0);


    for (int i=0; i<listColor.size(); ++i)
    {
        auto pos = 1.0 * i / listColor.size();
        
        conicalGradient.setColorAt(pos, listColor[i]);
    }
    conicalGradient.setColorAt(1.0, listColor[0]);
    painter.translate(rect.center());

    QBrush brush(conicalGradient);
    painter.setPen(Qt::NoPen);
    painter.setBrush(brush);

    QPainterPath path1;
    path1.addEllipse(QPoint(0, 0), radius, radius);

    QPainterPath path2;
    path2.addEllipse(QPoint(0, 0), radius * 0.8, radius* 0.8);
    painter.drawPath(path1- path2);

    QPointF ballPos = QPointF(cos(ballAngle * M_PI/180)*radius*0.9, -sin(ballAngle*M_PI/180)*radius*0.9);
    painter.setPen(QColor(0xff, 0xff, 0xff));
    painter.drawEllipse(ballPos, radius*0.2, radius*0.2);
    painter.setBrush(listColor[m_index]);

}
#include "colorselect.h"
#include "ui_colorselect.h"
#include <QPalette>

ColorSelect::ColorSelect(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ColorSelect)
{
    ui->setupUi(this);
    this->setWindowTitle(QString("Color Selector"));
    connect(ui->widget, SIGNAL(ColorInfo(int,QColor)), this, SLOT(ColorInfoProcess(int,QColor)));
}

ColorSelect::~ColorSelect()
{
    delete ui;
}

void ColorSelect::ColorInfoProcess(int index, QColor color)
{
    ui->lineEdit_index->setText(QString("%1").arg(index));
    ui->lineEdit_RGB->setText(color.name());
    QPalette pe;

    pe.setColor(ui->label_color->backgroundRole(), color);
    ui->label_color->setAutoFillBackground(true);
    ui->label_color->setPalette(pe);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vite源码学习--调试源码

简介 当我们开始构建越来越大型的应用时&#xff0c;需要处理的 JavaScript 代码量也呈指数级增长。包含数千个模块的大型项目相当普遍。基于 JavaScript 开发的工具就会开始遇到性能瓶颈&#xff1a;通常需要很长时间&#xff08;甚至是几分钟&#xff01;&#xff09;才能启…

接口日志表结构

表&#xff1a;ZTALL_IFLOG MANDT MANDT CLNT 3 0 0 客户端 UUID SYSUUID_C32 CHAR 32 0 0 16-byte UID in 32 chars (hexadecimal) IFSNR ZE_IFSNR CHAR 30 0 0 接口编号(系统ID流水号) FUNCNAME RS38L_FNAM CHAR 30 0 0 功能模块的名称 STATUS BAPI_MTYPE CHAR 1 0 0 消息类…

【计算机毕业设计】电影购票系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

linux--进程创建

执行了3次ps -f ,ps -f的父进程的ID(PPID)都是一样的,即bash. 实际上Linux上这个bash就是不断的复制自身,然后把复制出来的用exec替换成想要执行的程序(比如ps); 运行ps,发现ps是bash的一个子进程;原因就是bash把自己复制一份,然后替换成ps; 替换,这里就体现了写时拷贝的意义,…

学习vue3第十四节 Teleport 内置组件介绍

<Teleport></Teleport> 作用目的&#xff1a; 用于将指定的组件或者元素传送到指定的位置&#xff1b; 通常是自定义的全局通用弹窗&#xff0c;绑定到 body 上&#xff0c;而不是在当前元素上面&#xff1b; 使用方法&#xff1a; 接收两个参数 to: 要将目标传…

Ceph学习 - 1.存储知识

文章目录 1.存储基础1.1 基础知识1.1.1 存储基础1.1.2 存储使用 1.2 文件系统1.2.1 简介1.2.2 数据存储1.2.3 存储应用的基本方式1.2.4 文件存储 1.3 小结 1.存储基础 学习目标&#xff1a;这一节&#xff0c;我们从基础知识、文件系统、小节三个方面来学习。 1.1 基础知识 1.…

Qt中的网络通信

C没有封装专门的网络套接字的类&#xff0c;因此C只能调用C对应的API&#xff0c;而在Linux和Windows环境下的API都是不一样的 Qt作为一个C框架提供了相关封装好的套接字通信类 在Qt中需要用到两个类&#xff0c;两个类都属于network且都是属于IO操作&#xff0c;只不过这两个类…

第十四届蓝桥杯C/C++大学B组题解(一)

1、日期统计 #include <bits/stdc.h> using namespace std; int main() {int array[100] {5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6,…

Golang | Leetcode Golang题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; func myAtoi(s string) int {abs, sign, i, n : 0, 1, 0, len(s)//丢弃无用的前导空格for i < n && s[i] {i}//标记正负号if i < n {if s[i] - {sign -1i} else if s[i] {sign 1i}}for i < n && s[i] >…

DFS序列

什么是DFS序 DFS序是指对一棵树进行DFS时&#xff0c;每个节点被访问到的顺序。DFS序分成两个部分&#xff1a;进入该节点的顺序和退出该节点的顺序。 如何求DFS序 对于DFS中当前节点 1&#xff1a;计数 2&#xff1a;进入当前节点的顺序等于当前计数 3&#xff1a;想所有…

阿里云可观测 2024 年 3 月产品动态

本月可观测热文回顾 文章一览&#xff1a; 全新架构&#xff01;日志服务 SLS 自研免登录方案发布 AIOps 智能运维&#xff1a;有没有比专家经验更优雅的错/慢调用分析工具&#xff1f; 一文看懂如何做好 SQL 质量监控 使用 SPL 高效实现 Flink SLS Connector 下推 功能快…

pandas用法-详解教程

pandas用法-详解教程 一、生成数据表二、数据表信息查看三、数据表清洗四、数据预处理五、数据提取六、数据筛选七、数据汇总八、数据统计九、数据输出 一、生成数据表 1、首先导入pandas库&#xff0c;一般都会用到numpy库&#xff0c;所以我们先导入备用&#xff1a; impor…

深度学习理论基础(六)Transformer多头注意力机制

目录 一、自定义多头注意力机制1. 缩放点积注意力&#xff08;Scaled Dot-Product Attention&#xff09;● 计算公式● 原理 2. 多头注意力机制框图● 具体代码 二、pytorch中的子注意力机制模块 深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿…

docker基础学习指令

文章目录 [toc] docker基础常用指令一、docker 基础命令二、docker 镜像命令1. docker images2. docker search3. docker pull4. docker system df5. docker rmi1. Commit 命令 三、 docker 容器命令1. docker run2. docker logs3. docker top4. docker inspect5. docker cp6. …

Mybatis报错:Unsupported conversion from LONG to java.sql.Timestamp

Mybatis在封装结果集的时候&#xff0c;如果方法返回的是对象&#xff0c;则会去调用这个对象的无参构造方法。 如果实体类标注了Builder注解&#xff0c;则此注解会把默认的构造方法全部改成私有的&#xff0c;则Mybatis在通过无参构造方法反射创建对象时&#xff0c;就会找不…

#QT项目实战(天气预报)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; 3.记录&#xff1a; &#xff08;1&#xff09;调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…

Python学习之-魔术方法

前言&#xff1a; Python 中的魔术方法&#xff08;Magic Methods&#xff09;&#xff0c;也称作特殊方法&#xff08;Special Methods&#xff09;&#xff0c;是那些被双下划线包围的方法&#xff0c;例如 init。这些方法在 Python 中有特殊的含义&#xff0c;它们并不需要…

ThingsBoard通过MQTT发送遥测数据

MQTT基础 客户端 MQTT连接 遥测上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…

程序猿成长之路之数据挖掘篇——频繁项集挖掘介绍

频繁项集挖掘可以说是数据挖掘中的重点&#xff0c;下面我们来分析以下频繁项集挖掘的过程和目标 如果对数据挖掘没有概念的小伙伴可以查看上次的文章 https://blog.csdn.net/qq_31236027/article/details/137046475 什么是频繁项集&#xff1f; 在回答这个问题之前&#xff…

蓝桥杯第101题 拉马车 C++ Java Python

目录 题目 思路和解题方法 复杂度: c 代码 Java 版本&#xff08;仅供参考&#xff09; Python 版本&#xff08;仅供参考&#xff09; 代码细节 C 版本: Java 版本: Python 版本: 题目 思路和解题方法 这个游戏是一个简单的纸牌游戏&#xff0c;两个玩家轮流出牌&am…