取色器是软件开发中常用的小工具,为了方便在开发中取色,我自己开发了一款取色器,简单好用,主要是如果功能上有缺陷的我还能自己添加。

一、功能介绍

1. 点击选择自动截取当前屏幕图片,通过选择当前图片的色素来获取当前对应位置的颜色。

2. 复制按钮,可以复制右边选择框的内容。

3. 通过移动条形框,可以选择对应的颜色的RGB值。

4. 通过输入RGB值可以直接获取右边16进制的值。

5. 通过输入6位16进制的值可以获取对应的RGB值。

二、功能开发

1. 布局

布局说明如下图:

main布局使用垂直布局的方式。然后每一个layout使用水平布局方式。

void MainWindow::initUI()
{setWindowTitle("取色器");m_ptrWdgMain->setLayout(m_ptrLayoutMain);m_ptrLabShowColor = updateShowLable(m_ptrLabShowColor, Qt::black);m_ptrLabShowColor->setFixedSize(50, 50);m_ptrLayoutShowColor->addWidget(m_ptrLabShowColor);m_ptrLabShowRed = updateShowLable(m_ptrLabShowRed, Qt::black);m_ptrSliderRed = updateSlider(m_ptrSliderRed);m_ptrLabRed = updateShowLable(m_ptrLabRed, Qt::red);m_ptrLayoutRed->addWidget(m_ptrLabShowRed);m_ptrLayoutRed->addWidget(m_ptrSliderRed);m_ptrLayoutRed->addWidget(m_ptrLabRed);m_ptrLayoutRed->addWidget(m_ptrLineRed);m_ptrLineRed->setPlaceholderText("0-255");m_ptrLineRed->setText("0");m_ptrLabShowGreen = updateShowLable(m_ptrLabShowGreen, Qt::black);m_ptrSliderGreen = updateSlider(m_ptrSliderGreen);m_ptrLabGreen = updateShowLable(m_ptrLabGreen, Qt::green);m_ptrLayoutGreen->addWidget(m_ptrLabShowGreen);m_ptrLayoutGreen->addWidget(m_ptrSliderGreen);m_ptrLayoutGreen->addWidget(m_ptrLabGreen);m_ptrLayoutGreen->addWidget(m_ptrLineGreen);m_ptrLineGreen->setPlaceholderText("0-255");m_ptrLineGreen->setText("0");m_ptrLabShowBlue = updateShowLable(m_ptrLabShowBlue, Qt::black);m_ptrSliderBlue = updateSlider(m_ptrSliderBlue);m_ptrLabBlue = updateShowLable(m_ptrLabBlue, Qt::blue);m_ptrLayoutBlue->addWidget(m_ptrLabShowBlue);m_ptrLayoutBlue->addWidget(m_ptrSliderBlue);m_ptrLayoutBlue->addWidget(m_ptrLabBlue);m_ptrLayoutBlue->addWidget(m_ptrLineBlue);m_ptrLineBlue->setPlaceholderText("0-255");m_ptrLineBlue->setText("0");m_ptrLayoutButton->addWidget(m_ptrBtnPickColor);m_ptrLayoutButton->addWidget(m_ptrBtnCopy);m_ptrLayoutButton->addWidget(m_ptrLineColor);m_ptrLineColor->setPlaceholderText("6位16进制");m_ptrLayoutMain->addLayout(m_ptrLayoutShowColor);m_ptrLayoutMain->addLayout(m_ptrLayoutRed);m_ptrLayoutMain->addLayout(m_ptrLayoutGreen);m_ptrLayoutMain->addLayout(m_ptrLayoutBlue);m_ptrLayoutMain->addLayout(m_ptrLayoutButton);this->setCentralWidget(m_ptrWdgMain);
}

2. 控件消息绑定

QAbstractSlider::valueChanged :当滑动按钮值变动时触发。

QLineEdit::textChanged:当编辑按钮变动时触发。

QLineEdit::returnPressed:在结果编辑框回车时触发。

QPushButton::clicked :在按钮按下时触发。

void MainWindow::initConnect()
{connect(m_ptrSliderRed, SIGNAL(valueChanged(int)), this,SLOT(slotRedValue(int)));connect(m_ptrSliderGreen, SIGNAL(valueChanged(int)), this,SLOT(slotGreenValue(int)));connect(m_ptrSliderBlue, SIGNAL(valueChanged(int)), this,SLOT(slotBlueValue(int)));connect(m_ptrBtnPickColor, SIGNAL(clicked()), this, SLOT(slotPickColor()));connect(m_ptrBtnCopy, SIGNAL(clicked()), this, SLOT(slotCopyColorValue()));connect(m_ptrWdgPick, SIGNAL(finished(int)), this,SLOT(slotClosePickWidget(int)));connect(m_ptrWdgPick, &QPickWidget::sigColor, this,&MainWindow::slotGetColor);connect(m_ptrLineRed, SIGNAL(textChanged(QString)), this,SLOT(slotRedValueChange(QString)));connect(m_ptrLineGreen, SIGNAL(textChanged(QString)), this,SLOT(slotGreenValueChange(QString)));connect(m_ptrLineBlue, SIGNAL(textChanged(QString)), this,SLOT(slotBlueValueChange(QString)));// 绑定回车connect(m_ptrLineColor, &QLineEdit::returnPressed, this, [this]() {QString strColor = m_ptrLineColor->text();if (strColor.size() != 6) {return;}QColor color("#" + strColor);m_ptrLineRed->setText(QString::number(color.red()));m_ptrLineGreen->setText(QString::number(color.green()));m_ptrLineBlue->setText(QString::number(color.blue()));qInfo() << "m_ptrLineColor" << m_ptrLineColor->text();});
}

3. 控件消息处理

3.1 按钮选择按钮

隐藏本应用然后,然后截取桌面全屏,然后将应用的图片展示全屏。

void MainWindow::slotPickColor()
{this->hide();QTimer::singleShot(200, this, &MainWindow::slotShowPick);
}void MainWindow::slotShowPick()
{QScreen *screen = QGuiApplication::primaryScreen();m_ptrWdgPick->setPickPicture(screen->grabWindow(0));m_ptrWdgPick->showFullScreen();
}

3.2 滚动选择框

当前滚动值改变时,改变文本编辑框的内容。

void MainWindow::slotGreenValueChange(QString strValue)
{m_ptrSliderGreen->setValue(strValue.toInt());
}

3.3 输入框值改变

当用户输入框输入内容时,修改滚动条的值,并且改变颜色。

void MainWindow::updateShowColor()
{m_ptrLabShowColor->setPalette(QPalette(QPalette::Background, QColor(m_iRed, m_iGreen, m_iBulle)));QString strRed = QString("%1").arg(m_iRed, 2, 16, QLatin1Char('0'));QString strGreen = QString("%1").arg(m_iGreen, 2, 16, QLatin1Char('0'));QString strBlue = QString("%1").arg(m_iBulle, 2, 16, QLatin1Char('0'));m_ptrLineColor->setText(strRed + strGreen + strBlue);
}void MainWindow::slotRedValue(int value)
{m_ptrLineRed->setText(QString::number(value));m_iRed = value;updateLable(value, Red);updateShowColor();
}

4. 选择框逻辑

获取鼠标的坐标点。

1. 使用控件qlabel来展示放大的图。

2. 鼠标移动qlabel控件跟随移动。

3. 截取鼠标位置点的图片。

#include "qpickwidget.h"
#include <QKeyEvent>
#include <QtDebug>
#include <QBrush>
#include <QPalette>
#include <QRgb>
QPickWidget::QPickWidget(QWidget *parent): QDialog(parent), m_ptrLabMouse(new QLabel(this))
{m_ptrLabMouse->setFixedSize(100, 100);m_ptrLabMouse->setAutoFillBackground(true);m_ptrLabMouse->setPalette(QPalette(QPalette::Background, QColor(Qt::red)));m_ptrLabMouse->setAttribute(Qt::WA_TransparentForMouseEvents, true);this->setMouseTracking(true);setCursor(Qt::CrossCursor);initConnect();
}void QPickWidget::setPickPicture(QPixmap pixmap)
{m_pixmapPickPicture = pixmap;QPalette p;p.setBrush(QPalette::Background, QBrush(pixmap));this->setPalette(p);
}void QPickWidget::initConnect()
{// connect(this, SIGNAL(clicked()), this, SLOT(slotPickColor));
}void QPickWidget::slotPickColor() { this->close(); }void QPickWidget::keyPressEvent(QKeyEvent *event)
{if (event->key() == Qt::Key_Escape) {this->close();}
}void QPickWidget::showEvent(QShowEvent *event) { qInfo() << "showEvent"; }void QPickWidget::mouseMoveEvent(QMouseEvent *event)
{int mouse_x = event->x();int mouse_y = event->y();m_ptrLabMouse->move(mouse_x - m_ptrLabMouse->width() / 2,mouse_y - m_ptrLabMouse->height() / 2);// QRect rect(mouse_x - 3.5, mouse_y, 7, 7);QPixmap cropped =m_pixmapPickPicture.copy(mouse_x -4, mouse_y -4, 9, 9);QPixmap cropped1 = cropped.scaled(100, 100, Qt::KeepAspectRatio);QPalette p;p.setBrush(QPalette::Background, QBrush(cropped1));m_ptrLabMouse->setPalette(p);
}void QPickWidget::mousePressEvent(QMouseEvent *event)
{qInfo() << "mousePressEvent";QRgb tmp_rgb = m_pixmapPickPicture.toImage().pixel(event->x(), event->y());QColor rgb(tmp_rgb);emit sigColor(rgb.red(), rgb.green(), rgb.blue());this->close();
}

5. 源码

源码地址:三雷科技 / getColor · GitCode

取色器实战(Qt含源码)相关推荐

  1. PHP单页面加密视频教程附源码,thinkphp3.2最新版本项目实战视频教程(含源码)

    php教程 当前位置:主页 > php教程 > thinkphp3.2最新版本项目实战视频教程(含源码) thinkphp3.2最新版本项目实战视频教程(含源码) 教程大小:2.1GB   ...

  2. 太强了!Java毕业设计分享—基于Java开发的毕业设计实战项目(含源码+论文)

    你的毕业设计做好了吗? 上学是个苦差事,终于要毕业了还要被毕业设计绊一跤,别的专业且不说,计算机软件应用的学生最苦恼了,是不是还在为做毕业设计而烦恼? 以下为各位奉上25套毕业设计的精品,包括选题,论 ...

  3. 精选合辑 | 30个Python数据分析及实战项目(含源码)

    今天给大家推荐一个优质的Python公众号「法纳斯特」,作者:小F. 小F是211机械专业毕业的,上学的时候还造了两辆车(FSC.无碳小车),毕业以后又在车企搬了一年的砖,最终决定转行IT,从零开始学 ...

  4. 写不完的数学试卷-----试卷生成器(Qt含源码)

    最近在辅导我闺女数学题,发现她的思维逻辑是没有问题的,就是练习不够,因此在计算分数以及负数乘法的时候会经常出错,导致整个题目都做错了,为了让俺闺女能够在数学计算上得到充分的锻炼,锻炼的同时不希望她过多 ...

  5. 【YOLOv5】LabVIEW+TensorRT的yolov5部署实战(含源码)

    文章目录 前言 一.关于YOLOv5 二.YOLOv5模型的获取 1.下载源码 2.安装模块 3.下载预训练模型 4.转换为onnx模型 三.LabVIEW+TensorRT的yolov5部署实战(y ...

  6. macOS iOS 完整项目之全功能RSS阅读器 (教程含源码)

    实战需求 该项目是一个免费的开源 RSS 阅读器.它快速.稳定且易于访问. 向您展示来自您最喜欢的博客和新闻网站的文章,并跟踪您所阅读的内容.如果您一直在浏览器中逐页查找要阅读的新文章. 本文价值与收 ...

  7. 精选20个爆火的Python实战项目(含源码),直接拿走不谢

    今天给大家介绍20个非常实用的Python项目,帮助大家更好的学习Python. ① 猜字游戏 在这个游戏中,你必须一个字母一个字母的猜出秘密单词. 如果你猜错了一个字母,你将丢掉一条命. 正如游戏名 ...

  8. 秒杀系统设计思路与实战(含源码实现)

    一.限流与降级 客户端限流 按钮置灰 js控制每秒只能发送一个请求 站点层限流 1. Nginx限流 Nginx官方版本限制IP的连接和并发分别有两个模块: limit_req_zone: 用来限制单 ...

  9. Three.js着色器基础【含源码】

    着色器(Shader)是在 GPU 上运行的程序.它们被称为着色器的原因是,最初它们只处理3D对象的着色,但后来扩展到了3D对象之外.它们需要与传统编程不同的思维方式,因为程序是针对每个顶点或像素并行 ...

  10. 简单音乐播放器html+css+基础vue+含源码,有搜索和播放mv功能,代码可直接复制用。

    题目:html+css+基础vue实现的简单音乐播放器(含源码),有搜索和播放mv功能,代码可直接复制用. 问题描述: 如果vue刚入门,掌握一些基础语法后就可以写一个简单的音乐播放器来练练手~~如果 ...

最新文章

  1. 打牌软件可以控制吗_使用crm软件真的可以帮助企业省钱吗
  2. 记一次CTF实验吧的代码审计
  3. Laravel表单提交419页面过期
  4. python easy install_Python 安装easy_install详解
  5. 线程安全存储以及pthread_getspecific/pthread_setspecific
  6. 王者服务器维护什么时间结束s19,王者荣耀S19赛季什么时候结束 S19赛季结束时间...
  7. 基于dde的vb和matlab,基于VB和DDE技术的组态王通信协议转换
  8. Capsule:支持容器的JVM应用程序打包部署工具
  9. python 标量_标量 | NumPy 中文
  10. leetcode探索动态规划(一)
  11. 利用DDS IP实现线性调频信号(二)
  12. JAVA 中字符串的长度
  13. 酒店客房管理系统(JAVA,JSP,SERVLET,MYSQL)
  14. 利用Python将PDF转化为图片的方法
  15. 域计算机软件安装统计,如何通过SCCM查找客户端计算机已安装的软件清单
  16. Python 3 《List》入门练习
  17. app下载统计 php,如何统计app在各个渠道的下载量?
  18. linux编译.o文件,使用-O0编译Linux内核
  19. SWFObject 2.0的使用说明
  20. C语言基础之输出m到n之间的素数

热门文章

  1. ssm社区线上超市购物系统毕业设计-附源码211704
  2. 两个向量的夹角公式_向量的夹角公式!急急急!!!
  3. 数说海南——简单分析海南各市县近六年人口吸引力情况
  4. Bex5文档服务器,不通过登录直接打开BeX5的首页和功能页的url是什么?
  5. 手机屏碎了,怎样辨别是外屏坏还是内屏坏,看完这篇文章就明白了
  6. 如何使用分区工具实现无损分区大小调整?
  7. navicat运行db文件_在 Navicat for MongoDB 使用文档
  8. wifi 协议栈的历史的总结
  9. 三菱Q系列plc串口通讯四台台达变频器通讯程序
  10. [OS X軟件] 我一直在用的 司机会看的那种 免费资源又多