【写在前面】

        在做编辑相关的应用经常会用到颜色选择器。

        实际上, Qt Widgets 时代使用 QColorDialog 或者 Qml 中 ColorDialog 即可完成一般的颜色选择的需求。

        然鹅现在都 Windows 11了!!还在用那么拉跨的东西,实在是看不下去了。

        然后自己一直很喜欢用 Windows 画图3D的那个颜色选择器,因此我决定仿照实现一个,并且还为它增加了一个透明度。


【正文开始】

       不多bb,先直接看效果图,喜欢的话接着往下看~

       首先,需要实现一个渐变的面板,这里用了一点小小的技巧。

       底层用 白色=>当前颜色的渐变(左到右),上层用纯透明=>纯不透明黑色的渐变(上到下),然后他们混合起来就是我们一般见到的渐变面板。

Rectangle {x: pickerRect.cursorWidth * 0.5y: pickerRect.height - pickerRect.cursorWidth * 0.5width: pickerRect.height - pickerRect.cursorWidthheight: pickerRect.width - pickerRect.cursorWidthrotation: -90transformOrigin: Item.TopLeftgradient: Gradient {GradientStop { position: 0.0; color: "white" }GradientStop { position: 1.0; color: pickerRect.hueColor }}
}Rectangle {x: pickerRect.cursorWidth * 0.5y: pickerRect.cursorWidth * 0.5width: pickerRect.width - pickerRect.cursorWidthheight: pickerRect.height - pickerRect.cursorWidthgradient: Gradient {GradientStop { position: 1.0; color: "#ff000000" }GradientStop { position: 0.0; color: "#00000000" }}
}

       接着,现在要实现一个 hue 的颜色选择条带:

Rectangle {id: huePickerwidth: pickerRect.width - pickerRect.cursorWidthheight: 32anchors.top: pickerRect.bottomanchors.topMargin: 10anchors.left: contentText.leftgradient: Gradient {orientation: Gradient.HorizontalGradientStop { position: 0.0;  color: "#ff0000" }GradientStop { position: 0.16; color: "#ffff00" }GradientStop { position: 0.33; color: "#00ff00" }GradientStop { position: 0.5;  color: "#00ffff" }GradientStop { position: 0.76; color: "#0000ff" }GradientStop { position: 0.85; color: "#ff00ff" }GradientStop { position: 1.0;  color: "#ff0000" }}Rectangle {id: hueSliderwidth: heightheight: parent.heightanchors.verticalCenter: parent.verticalCenterborder.color: "#e6e6e6"border.width: 2scale: 0.9color: pickerRect.hueColorproperty real value: x / (parent.width - width)Behavior on scale { NumberAnimation { easing.type: Easing.OutBack; duration: 300 } }Rectangle {anchors.fill: parentanchors.margins: 1color: "transparent"border.color: "white"border.width: 2}}MouseArea {anchors.fill: parentfunction handleCursorPos(x) {let halfWidth = hueSlider.width * 0.5;hueSlider.x = Math.max(0, Math.min(width, x + halfWidth) - hueSlider.width);}onPressed: (mouse) => {hueSlider.scale = 0.6;handleCursorPos(mouse.x);}onReleased: hueSlider.scale = 0.9;onPositionChanged: (mouse) => handleCursorPos(mouse.x);}
}

       渐变条带比较简单,精确控制好渐变位置即可,然后增加了一个选择的方块,用于判断和选择位置。

       接着我们要增加一个透明度选择条带,这里我们先生成一些黑白相间的格子作为底层,然后在上面放上透明=>不透明的条带即可:

Item {id: alphaPickerItemwidth: huePicker.widthheight: huePicker.heightanchors.top: huePicker.bottomanchors.topMargin: 25anchors.left: huePicker.leftGrid {id: alphaPickeranchors.fill: parentrows: 4columns: 29clip: trueproperty real cellWidth: width / columnsproperty real cellHeight: height / rowsRepeater {model: parent.columns * parent.rowsRectangle {width: alphaPicker.cellWidthheight: widthcolor: (index % 2 == 0) ? "gray" : "transparent"}}}Rectangle {anchors.fill: parentgradient: Gradient {orientation: Gradient.HorizontalGradientStop { position: 1.0; color: "#ff000000" }GradientStop { position: 0.0; color: "#00ffffff" }}}Rectangle {id: alphaSliderx: parent.width - widthwidth: heightheight: parent.heightanchors.verticalCenter: parent.verticalCentercolor: Qt.rgba(0.1, 0.1, 0.1, (value + 1.0) / 2.0)border.color: "#e6e6e6"border.width: 2scale: 0.9property real value: x / (parent.width - width)Behavior on scale { NumberAnimation { easing.type: Easing.OutBack; duration: 300 } }Rectangle {anchors.fill: parentanchors.margins: 1color: "transparent"border.color: "white"border.width: 1}}MouseArea {anchors.fill: parentfunction handleCursorPos(x) {let halfWidth = alphaSlider.width * 0.5;alphaSlider.x = Math.max(0, Math.min(width, x + halfWidth) - alphaSlider.width);}onPressed: (mouse) => {alphaSlider.scale = 0.6;handleCursorPos(mouse.x);}onReleased: alphaSlider.scale = 0.9;onPositionChanged: (mouse) => handleCursorPos(mouse.x);}
}

       和渐变条带一致,这里也放置了一个选择框。

       到这里,比较重要的部分就讲完了,不过我要提示一些 Qml 的小技巧:

       Qml color 类型有一些很好用的属性,例如:hsvHue、hsvSaturation、hsvValue、hslHue、 hslSaturation、 hslLightness,这些属性在实现颜色相关控件时非常有用。

       最后还有一些其他零碎的代码,例如编辑框,过渡动画等等就不再赘述了,自行下载源码编辑测试即可。


【结语】

       一开始我实现的 ColorPicker 只是一个 Rectangle 中,然鹅很多时候也需要弹窗形式的,所以又增加了一个 ColorPickerPopup ,直接下载源码就可以获得了(多多star呀..⭐_⭐):。

​​​​​​​       Github的:​​​​​​​GitHub - mengps/QmlControls: Qt / Qml 控件Qt / Qml 控件. Contribute to mengps/QmlControls development by creating an account on GitHub.https://github.com/mengps/QmlControls​​​​​​​       CSDN的:https://download.csdn.net/download/u011283226/86995876https://download.csdn.net/download/u011283226/86995876

纯 Qml 实现仿画图3D的颜色选择器(更强更易用)相关推荐

  1. R语言生成仿真的3D高斯簇数据集、使用scale函数进行数据缩放、并使用KMeans进行聚类分析、数据反向缩放并比较聚类生成的中心和实际数据的中心的差异、预测新的数据所属的聚类簇

    R语言生成仿真的3D高斯簇数据集.使用scale函数进行数据缩放.并使用KMeans进行聚类分析.数据反向缩放并比较聚类生成的中心和实际数据的中心的差异.预测新的数据所属的聚类簇 目录

  2. css和js实现3d图片,JavaScript_纯JS实现旋转图片3D展示效果,CSS:style type=text/cssgt - phpStudy...

    纯JS实现旋转图片3D展示效果 CSS: #show{position:relative;margin:20px auto;width:800px;} .item{position:absolute; ...

  3. HTML5 Canvas 高仿逼真 3D 布料图案效果

    HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大.下面给大家分享一个 HTML5 C ...

  4. html怎么实现聊天界面设计,纯css制作仿微信聊天页面

    纯css制作仿微信聊天页面 *{ margin: 0; padding: 0; } body{ font-size: 14px; } .triangle{ margin: 100px auto ; w ...

  5. Matplotlib科研画图.调色盘颜色提取和更改

    Matplotlib科研画图.调色盘颜色提取和更改 #提取调色盘颜色 palette#提取seaborn调色盘颜色 plt.style.use('default') #清空之前调色盘更改 sns.se ...

  6. 用Win10自带的画图3D快速抠图

    Win10更新后附有很多有趣的功能,今天意外发现画图3D可以抠图,来分享一波~ 1.打开软件 搜索"画图"就能看到新的画图3D啦! 2. 先复制图片,选择粘贴选项 可爱的小埋出现啦 ...

  7. 怎样用计算机画图抠图,抠图超方便 Win10画图3D应用添新功能

    喜欢抠图换背景的P图爱好者们有福了,Win10画图3D应用在最近一次更新中增加了若干新功能,其中一项"魔术选择"能让用户更方便更精准的从一张图中抠取你需要的部分,然后将它添加到其它 ...

  8. 使用win10画图3D进行图片拼接

    一.拼接以下三张图片. 二.随便选择一张图片,使用 画图3D 打开. 三.点击画布,然后鼠标拖动调整画布大小,建议先将画布调整的尽量大一些,拼接完成之后再调小,如下图所示: 四.导入需要拼接的其他图片 ...

  9. 关于Altium Designer“放置3D体”颜色为 灰色 的解决方法

    ⭐好久没更新博客了,之前想分享的内容因为自身还没吃透,所以一拖再拖,再等等吧,好东西不怕晚.今天呢,想解决一下关于AD20"放置3D体"颜色为灰色的问题.对之前写的一篇文章做一下补 ...

最新文章

  1. scala语言运行递归“分鱼”程序
  2. php语言出现弹框 再提交怎么写,jquery/php和多语言确认/警报框
  3. pycharm导入(import)报红(出现红色波浪线)解决办法(Mark Directory as —— Sources Root)
  4. 摄像头poe供电原理_什么是POE供电,这种POE套装有什么优势呢?
  5. 青岛计算机类职业中学,青岛最好的职业学校有哪些?
  6. mysql 索引:类型 、创建
  7. java 判断日期连续_如何在Java中检查日期是否大于另一个日期?[重复]
  8. 013年十大急需的热门IT技能
  9. java long类型判断_Java中的long类型和Long类型比较大小
  10. RabbitMQ的六种工作模式(三)
  11. 5.4 continue,break跳出循环
  12. sql语句中表格缩写命名_数据库表字段命名规范
  13. PYECHARTS 实战 国内/国际地图航线图制作 (一)
  14. js验证开始时间和结束时间 结束时间不能比开始时间早
  15. python oserror怎么解决_python – OSError:目录不是空的,如何修复?
  16. Photoshop2018安装
  17. 【听课笔记】复旦大学遗传学_10肿瘤遗传学
  18. IJCAI 2022|边界引导的伪装目标检测模型BGNet
  19. 淘宝新上架的产品如何在站内SEO优化
  20. 金笛JDMAIL邮件服务器证券行业邮件归档解决方案

热门文章

  1. 【丁丁历险记】ESP32-CAM做图像识别
  2. 搭建域控和添加本域辅域控,加入域(上)(精准扶小白)
  3. 刺激战场国际服务器没有响应,刺激战场连接服务器没有响应怎么办? 绝地求生刺激战场服务器没响应解决方法是什么?...
  4. 雨课堂python答案_带雨字好听的名字大全
  5. Pr导出视频的时候,加速
  6. 修改注册表实现XP系统自动登录
  7. java后台rxjava_RxJava在服务端是否有使用场景和优势?
  8. 招才猫显示服务器开小差,网络罢工开小差?宽带自排障手册分分钟解决!
  9. ffmpeg基本使用方法
  10. 【学习笔记asp.net】WebService创建、发布及在IIS上部署