一、前言

这个控件主要是模仿QColorDialog对话框中的颜色选取面板,提供一个十字形状的标识器,鼠标按下开始选取颜色,移动到哪就选择该处的颜色值,对应右侧颜色条放大显示,本控件的难点就是如何绘制一个边缘框限定鼠标只能在此框中移动,还有一个就是如何绘制颜色渐变的背景颜色集合,这里采用的是对每一个像素的高度区域设置不同的开始颜色+中间颜色+结束颜色,作为渐变颜色,然后设置QLinearGradient作为画笔的颜色进行绘制,其实就是假设宽度是100,其实是绘制了100条垂直方向的竖线而形成的效果。在绘制画布的时候,可以将其绘制到一个pixmap上,这样也方便待会鼠标移动时候直接取该pixmap的某个像素点的颜色值。

二、实现的功能

  • 1:可设置当前百分比,用于控制指针大小
  • 2:可设置边框宽度
  • 3:可设置边框颜色
  • 4:可设置指针颜色

三、效果图

四、头文件代码

#ifndef COLORPANELHSB_H
#define COLORPANELHSB_H/*** 颜色选取面板 作者:feiyangqingyun(QQ:517216493) 2017-11-17* 1:可设置当前百分比,用于控制指针大小* 2:可设置边框宽度* 3:可设置边框颜色* 4:可设置指针颜色*/#include <QWidget>#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endifclass QDESIGNER_WIDGET_EXPORT ColorPanelHSB : public QWidget
#else
class ColorPanelHSB : public QWidget
#endif{Q_OBJECTQ_PROPERTY(int percent READ getPercent WRITE setPercent)Q_PROPERTY(QColor borderColor READ getBorderColor WRITE setBorderColor)Q_PROPERTY(QColor cursorColor READ getCursorColor WRITE setCursorColor)Q_PROPERTY(QColor color READ getColor)Q_PROPERTY(double hue READ getHue)Q_PROPERTY(double sat READ getSat)public:explicit ColorPanelHSB(QWidget *parent = 0);protected:void showEvent(QShowEvent *);void resizeEvent(QResizeEvent *);void mousePressEvent(QMouseEvent *e);void mouseMoveEvent(QMouseEvent *e);void paintEvent(QPaintEvent *);void drawBg(QPainter *painter);void drawCursor(QPainter *painter);void drawBorder(QPainter *painter);private:int percent;                //当前百分比int borderWidth;            //边框宽度QColor borderColor;         //边框颜色QColor cursorColor;         //鼠标按下处的文字形状颜色QColor color;               //鼠标按下处的颜色double hue;                 //hue值double sat;                 //sat值QPoint lastPos;             //最后鼠标按下去的坐标QPixmap bgPix;              //背景颜色图片public:int getPercent()            const;QColor getBorderColor()     const;QColor getCursorColor()     const;QColor getColor()           const;double getHue()             const;double getSat()             const;QSize sizeHint()            const;QSize minimumSizeHint()     const;public Q_SLOTS://设置百分比void setPercent(int percent);//设置边框颜色void setBorderColor(const QColor &borderColor);//设置文字形状颜色void setCursorColor(const QColor &cursorColor);Q_SIGNALS:void colorChanged(const QColor &color, double hue, double sat);};#endif // COLORPANELHSB_H

五、核心代码

void ColorPanelHSB::paintEvent(QPaintEvent *)
{//绘制准备工作,启用反锯齿QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);//绘制背景颜色drawBg(&painter);//绘制按下出的形状drawCursor(&painter);//绘制边框drawBorder(&painter);
}void ColorPanelHSB::drawBg(QPainter *painter)
{painter->save();if (!bgPix.isNull()) {painter->drawPixmap(0, 0, bgPix);}painter->restore();
}void ColorPanelHSB::drawCursor(QPainter *painter)
{painter->save();painter->setPen(cursorColor);QString text = "+";//根据右侧的百分比显示字体大小QFont textFont;int size = 20 + (35 * (double)percent / 100);textFont.setPixelSize(size);//计算文字的宽度高度,自动移到鼠标按下处的中心点QFontMetrics fm(textFont);int textWidth = fm.width(text);int textHeight = fm.height();QPoint textPoint = lastPos - QPoint(textWidth / 2, -(textHeight / 4));QPainterPath path;path.addText(textPoint, textFont, text);painter->drawPath(path);painter->restore();
}void ColorPanelHSB::drawBorder(QPainter *painter)
{painter->save();int width = this->width();int height = this->height();int offset = borderWidth;QPen pen;pen.setWidth(offset);pen.setColor(borderColor);pen.setCapStyle(Qt::RoundCap);pen.setJoinStyle(Qt::MiterJoin);painter->setPen(pen);painter->setBrush(Qt::NoBrush);painter->drawRect(offset / 2, offset / 2, width - offset, height - offset);painter->restore();
}

六、控件介绍

  1. 超过149个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
  2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。
  3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
  4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
  5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
  6. 每个控件默认配色和demo对应的配色都非常精美。
  7. 超过130个可见控件,6个不可见控件。
  8. 部分控件提供多种样式风格选择,多种指示器样式选择。
  9. 所有控件自适应窗体拉伸变化。
  10. 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。
  11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。
  12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
  13. 所有控件最后生成一个dll动态库文件,可以直接集成到qtcreator中拖曳设计使用。
  14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。

七、SDK下载

  • SDK下载链接:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取码:877p
  • 下载链接中包含了各个版本的动态库文件,所有控件的头文件,使用demo,自定义控件+属性设计器。
  • 自定义控件插件开放动态库dll使用(永久免费),无任何后门和限制,请放心使用。
  • 目前已提供26个版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
  • 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!
  • widget版本(QQ:517216493)qml版本(QQ:373955953)三峰驼(QQ:278969898)。
  • 涛哥的知乎专栏 Qt进阶之路 https://zhuanlan.zhihu.com/TaoQt
  • 欢迎关注微信公众号【高效程序员】,C++/Python、学习方法、写作技巧、热门技术、职场发展等内容,干货多多,福利多多!

转载于:https://www.cnblogs.com/feiyangqingyun/p/11185729.html

Qt编写自定义控件29-颜色选取面板相关推荐

  1. Qt编写自定义控件4-旋转仪表盘

    前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...

  2. Qt编写自定义控件44-天气仪表盘

    一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...

  3. Qt编写自定义控件3-速度仪表盘

    前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业领域等, ...

  4. Qt编写自定义控件14-环形进度条

    前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...

  5. Qt编写自定义控件35-GIF录屏控件

    一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...

  6. Qt编写自定义控件及插件的使用

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

  7. Qt编写自定义控件22-蚂蚁线

    一.前言 关于蚂蚁线控件,相信很多用过PS的人都知道,在选中某个区域以后,边上的线条会有一种动态流动的效果,这种效果就叫做蚂蚁线,百科的解释是:动物的一种本能现象,领头的蚂蚁以随机的路线走向食物或洞穴 ...

  8. Qt编写自定义控件插件路过的坑及注意事项

    在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/61 ...

  9. Qt编写自定义控件37-发光按钮(会呼吸的痛)

    一.前言 这个控件是好早以前写的,已经授权过好几个人开源过此控件代码,比如红磨坊小胖,此控件并不是来源于真实需求,而仅仅是突发奇想,类似于星星的闪烁,越到边缘越来越淡,定时器动态改变边缘发光的亮度,产 ...

最新文章

  1. pandas版xml json excel互转
  2. 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 扫描版
  3. 生成两个表的笛卡尔积
  4. 采用静态配置文件方式实现AOP
  5. java axmlprinter_安卓xml配置文件解析工具-AXMLPrinter2.jar(androidmanifest.xml 反编译)下载官方最新版-西西软件下载...
  6. 超链接禁用_如何在Microsoft Word中禁用超链接
  7. [转] 前端学习必备基础(1)
  8. 收藏 | 图解 Git 工作原理
  9. World Wind Java开发之二 使用Winbuilders设计图形用户界面(转)
  10. C语言小知识---特殊的字符串
  11. python字符串变量_Python从变量读取的特殊字符切分字符串问题
  12. (转)distcp从ftp到hdfs拷贝文件
  13. hyper-v redhat使用新网卡
  14. Atitit 高并发 性能指标 与压测工具 压测方法 目录 1. 性能的几个指标 1 1.1. 主要是响应时间(Response time) 1 1.2. 2.吞吐量(Throughput) 1 1
  15. 自我管理 写好工作周报
  16. win10背景显示计算机名,如何自定义Win10计算机的开始菜单背景和图片
  17. 软件测试功能测试全套常见面试题【开放性思维题】面试总结4-3
  18. opencv存取视频的编码格式 fourcc
  19. Layui文件下载(VIP典藏版)
  20. 关于O、Θ、Ω、o、ω等数学符号

热门文章

  1. 双十一流量洪峰 支撑阿里核心业务的云数据库揭秘 1
  2. pycharm如何设置python版本、设置国内pip镜像、添加第三方类库
  3. js文件、图片上传(原生方法和jquery的ajax两种都有)
  4. 谈谈OAB离线地址簿无法更新问题?(服务器是Exchange 2007和Exchange 2010)
  5. $_SERVER 详情
  6. Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解
  7. CSS中选择器优先级顺序实战讲解
  8. 企业中个别机械类制图软件无法打印的问题汇总
  9. Vlan9.com论坛 2007-10-30精华技术文档
  10. libiconv交叉移植