• 取色器实战(Qt含源码)


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

    一、功能介绍

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

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

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

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

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

    二、功能开发

    1. 布局

    布局说明如下图:

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

    1. void MainWindow::initUI()
    2. {
    3. setWindowTitle("取色器");
    4. m_ptrWdgMain->setLayout(m_ptrLayoutMain);
    5. m_ptrLabShowColor = updateShowLable(m_ptrLabShowColor, Qt::black);
    6. m_ptrLabShowColor->setFixedSize(50, 50);
    7. m_ptrLayoutShowColor->addWidget(m_ptrLabShowColor);
    8. m_ptrLabShowRed = updateShowLable(m_ptrLabShowRed, Qt::black);
    9. m_ptrSliderRed = updateSlider(m_ptrSliderRed);
    10. m_ptrLabRed = updateShowLable(m_ptrLabRed, Qt::red);
    11. m_ptrLayoutRed->addWidget(m_ptrLabShowRed);
    12. m_ptrLayoutRed->addWidget(m_ptrSliderRed);
    13. m_ptrLayoutRed->addWidget(m_ptrLabRed);
    14. m_ptrLayoutRed->addWidget(m_ptrLineRed);
    15. m_ptrLineRed->setPlaceholderText("0-255");
    16. m_ptrLineRed->setText("0");
    17. m_ptrLabShowGreen = updateShowLable(m_ptrLabShowGreen, Qt::black);
    18. m_ptrSliderGreen = updateSlider(m_ptrSliderGreen);
    19. m_ptrLabGreen = updateShowLable(m_ptrLabGreen, Qt::green);
    20. m_ptrLayoutGreen->addWidget(m_ptrLabShowGreen);
    21. m_ptrLayoutGreen->addWidget(m_ptrSliderGreen);
    22. m_ptrLayoutGreen->addWidget(m_ptrLabGreen);
    23. m_ptrLayoutGreen->addWidget(m_ptrLineGreen);
    24. m_ptrLineGreen->setPlaceholderText("0-255");
    25. m_ptrLineGreen->setText("0");
    26. m_ptrLabShowBlue = updateShowLable(m_ptrLabShowBlue, Qt::black);
    27. m_ptrSliderBlue = updateSlider(m_ptrSliderBlue);
    28. m_ptrLabBlue = updateShowLable(m_ptrLabBlue, Qt::blue);
    29. m_ptrLayoutBlue->addWidget(m_ptrLabShowBlue);
    30. m_ptrLayoutBlue->addWidget(m_ptrSliderBlue);
    31. m_ptrLayoutBlue->addWidget(m_ptrLabBlue);
    32. m_ptrLayoutBlue->addWidget(m_ptrLineBlue);
    33. m_ptrLineBlue->setPlaceholderText("0-255");
    34. m_ptrLineBlue->setText("0");
    35. m_ptrLayoutButton->addWidget(m_ptrBtnPickColor);
    36. m_ptrLayoutButton->addWidget(m_ptrBtnCopy);
    37. m_ptrLayoutButton->addWidget(m_ptrLineColor);
    38. m_ptrLineColor->setPlaceholderText("6位16进制");
    39. m_ptrLayoutMain->addLayout(m_ptrLayoutShowColor);
    40. m_ptrLayoutMain->addLayout(m_ptrLayoutRed);
    41. m_ptrLayoutMain->addLayout(m_ptrLayoutGreen);
    42. m_ptrLayoutMain->addLayout(m_ptrLayoutBlue);
    43. m_ptrLayoutMain->addLayout(m_ptrLayoutButton);
    44. this->setCentralWidget(m_ptrWdgMain);
    45. }

    2. 控件消息绑定

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

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

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

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

    1. void MainWindow::initConnect()
    2. {
    3. connect(m_ptrSliderRed, SIGNAL(valueChanged(int)), this,
    4. SLOT(slotRedValue(int)));
    5. connect(m_ptrSliderGreen, SIGNAL(valueChanged(int)), this,
    6. SLOT(slotGreenValue(int)));
    7. connect(m_ptrSliderBlue, SIGNAL(valueChanged(int)), this,
    8. SLOT(slotBlueValue(int)));
    9. connect(m_ptrBtnPickColor, SIGNAL(clicked()), this, SLOT(slotPickColor()));
    10. connect(m_ptrBtnCopy, SIGNAL(clicked()), this, SLOT(slotCopyColorValue()));
    11. connect(m_ptrWdgPick, SIGNAL(finished(int)), this,
    12. SLOT(slotClosePickWidget(int)));
    13. connect(m_ptrWdgPick, &QPickWidget::sigColor, this,
    14. &MainWindow::slotGetColor);
    15. connect(m_ptrLineRed, SIGNAL(textChanged(QString)), this,
    16. SLOT(slotRedValueChange(QString)));
    17. connect(m_ptrLineGreen, SIGNAL(textChanged(QString)), this,
    18. SLOT(slotGreenValueChange(QString)));
    19. connect(m_ptrLineBlue, SIGNAL(textChanged(QString)), this,
    20. SLOT(slotBlueValueChange(QString)));
    21. // 绑定回车
    22. connect(m_ptrLineColor, &QLineEdit::returnPressed, this, [this]() {
    23. QString strColor = m_ptrLineColor->text();
    24. if (strColor.size() != 6) {
    25. return;
    26. }
    27. QColor color("#" + strColor);
    28. m_ptrLineRed->setText(QString::number(color.red()));
    29. m_ptrLineGreen->setText(QString::number(color.green()));
    30. m_ptrLineBlue->setText(QString::number(color.blue()));
    31. qInfo() << "m_ptrLineColor" << m_ptrLineColor->text();
    32. });
    33. }

    3. 控件消息处理

    3.1 按钮选择按钮

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

    1. void MainWindow::slotPickColor()
    2. {
    3. this->hide();
    4. QTimer::singleShot(200, this, &MainWindow::slotShowPick);
    5. }
    6. void MainWindow::slotShowPick()
    7. {
    8. QScreen *screen = QGuiApplication::primaryScreen();
    9. m_ptrWdgPick->setPickPicture(screen->grabWindow(0));
    10. m_ptrWdgPick->showFullScreen();
    11. }

    3.2 滚动选择框

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

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

    3.3 输入框值改变

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

    1. void MainWindow::updateShowColor()
    2. {
    3. m_ptrLabShowColor->setPalette(
    4. QPalette(QPalette::Background, QColor(m_iRed, m_iGreen, m_iBulle)));
    5. QString strRed = QString("%1").arg(m_iRed, 2, 16, QLatin1Char('0'));
    6. QString strGreen = QString("%1").arg(m_iGreen, 2, 16, QLatin1Char('0'));
    7. QString strBlue = QString("%1").arg(m_iBulle, 2, 16, QLatin1Char('0'));
    8. m_ptrLineColor->setText(strRed + strGreen + strBlue);
    9. }
    10. void MainWindow::slotRedValue(int value)
    11. {
    12. m_ptrLineRed->setText(QString::number(value));
    13. m_iRed = value;
    14. updateLable(value, Red);
    15. updateShowColor();
    16. }

    4. 选择框逻辑

    获取鼠标的坐标点。

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

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

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

    1. #include "qpickwidget.h"
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. QPickWidget::QPickWidget(QWidget *parent)
    8. : QDialog(parent)
    9. , m_ptrLabMouse(new QLabel(this))
    10. {
    11. m_ptrLabMouse->setFixedSize(100, 100);
    12. m_ptrLabMouse->setAutoFillBackground(true);
    13. m_ptrLabMouse->setPalette(QPalette(QPalette::Background, QColor(Qt::red)));
    14. m_ptrLabMouse->setAttribute(Qt::WA_TransparentForMouseEvents, true);
    15. this->setMouseTracking(true);
    16. setCursor(Qt::CrossCursor);
    17. initConnect();
    18. }
    19. void QPickWidget::setPickPicture(QPixmap pixmap)
    20. {
    21. m_pixmapPickPicture = pixmap;
    22. QPalette p;
    23. p.setBrush(QPalette::Background, QBrush(pixmap));
    24. this->setPalette(p);
    25. }
    26. void QPickWidget::initConnect()
    27. {
    28. // connect(this, SIGNAL(clicked()), this, SLOT(slotPickColor));
    29. }
    30. void QPickWidget::slotPickColor() { this->close(); }
    31. void QPickWidget::keyPressEvent(QKeyEvent *event)
    32. {
    33. if (event->key() == Qt::Key_Escape) {
    34. this->close();
    35. }
    36. }
    37. void QPickWidget::showEvent(QShowEvent *event) { qInfo() << "showEvent"; }
    38. void QPickWidget::mouseMoveEvent(QMouseEvent *event)
    39. {
    40. int mouse_x = event->x();
    41. int mouse_y = event->y();
    42. m_ptrLabMouse->move(mouse_x - m_ptrLabMouse->width() / 2,
    43. mouse_y - m_ptrLabMouse->height() / 2);
    44. // QRect rect(mouse_x - 3.5, mouse_y, 7, 7);
    45. QPixmap cropped =
    46. m_pixmapPickPicture.copy(mouse_x -4, mouse_y -4, 9, 9);
    47. QPixmap cropped1 = cropped.scaled(100, 100, Qt::KeepAspectRatio);
    48. QPalette p;
    49. p.setBrush(QPalette::Background, QBrush(cropped1));
    50. m_ptrLabMouse->setPalette(p);
    51. }
    52. void QPickWidget::mousePressEvent(QMouseEvent *event)
    53. {
    54. qInfo() << "mousePressEvent";
    55. QRgb tmp_rgb = m_pixmapPickPicture.toImage().pixel(event->x(), event->y());
    56. QColor rgb(tmp_rgb);
    57. emit sigColor(rgb.red(), rgb.green(), rgb.blue());
    58. this->close();
    59. }

    5. 源码

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

  • 相关阅读:
    C# 中的特性
    AspectCore和MSDI 实现Name注册以及解析对象
    算法笔记:二叉树
    Vsftpd文件传输服务(三种认证模式:匿名开放 、本地用户、虚拟用户)
    聚观早报 | 百度糯米发布下线公告;零跑汽车获港交所上市批准
    Redis 6.0 新功能
    解决计算机视觉模型中的种族和性别偏见问题,Meta开源 FACET工具
    conda配置多版本python
    分享从零开始学习网络设备配置--任务3.5 使用静态路由实现网络连通
    基于单片机智能汽车仪表设计系统
  • 原文地址:https://blog.csdn.net/arv002/article/details/126004176