01 Qt自定义风格控件的基本原则

              目录

1.继承原生控件

2.组合原生控件

3.仿写原生控件

PS:后续将继续分享开发实践中各类自定义控件的方法、思路以及组件库


1.继承原生控件

关键字:继承、paintEvent

    这里想说的是,Qt的Gui框架在封装原生控件的同时, 也为开发者提供了各种虚接口函数。如果Qt原生控件+QSS样式表的组合满足不了业务开发的风格需要时, 那么继承Qt原生控件、重写绘制关联虚接口函数一定是我封装控件的第一选择。

比如:下面虚线风格的滑动条

图1-1

Qt原生风格的QSlider显然不可能达到该效果,那么继承QSlider类,然后重写虚函数QSlider::paintEvent,分别绘制groove、刻度线、进度以及滑块,就可以实现目标效果!

    这里为什么要刻意强调继承原生控件呢?因为,继承了原生控件,你才能保持控件的基本功能接口的有效复用,而在paintEvent中,无论做什么绘制,都依赖于各个接口的返回结果(比如:滑动条的进度值)。当然,并不是所有的绘制都是简单的一个虚函数paintEvent可以搞定的,这个要具体问题具体分析!

2.组合原生控件

关键字:组合、布局

    这里所说的组合原生控件是指:在原生控件的基础上布局新的子控件,以满足业务需求、实现新的自定义风格的控件。

举个例子:下图所示的带按钮的编辑框非常常见

2-1
图2-1

而QLineEdit类显然不具备上述按钮功能,那么遵循该原则的实现思路就是:能否把一个按钮QPushButton布局在QLineEdit的右边,两个父子控件组合在一起的话是不是就达到了预期的效果了呢? 显然是可以的!

当然,上述控件的实现思路很多,每个开发者都会有自己的独特视角!

3.仿写原生控件

仿写原生控件当然是代价最高的一种自定义风格控件的实现方式!

这意味着,开发者要重新造轮子,根据目标效果另起炉灶、完全重写一个新的控件类。

比如,下图展示的时间选择控件:

图3-1

 显然,这个时间选择组件,由两部分组成,首先是一个可编辑时间的编辑框,其次,当点击时间值后,会在下面显示时间选择Popup弹窗。而且每一个子控件都是需要重新实现的新风格组件。

所以第三种情形下,就要开发者无所不用其极的实现渲染效果以及预期业务功能接口了。

PS:后续将继续分享开发实践中各类自定义控件的方法、思路以及组件库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AGI|一篇小白都能看懂的RAG入门介绍!

目录 一、前言 二、LLM主要存在的问题 三、RAG 是什么? 四、RAG中的搜索器 (一)主要的检索技术 (二)知识库索引技术 五、RAG目前遇到的问题和展望 一、前言 随着近几年AIGC的发展,不仅是大模型自身在…

Web3探索加密世界:什么是空投?

随着加密货币行业的迅速发展,人们开始听说各种各样的术语,其中包括"空投"(Airdrop)。在这里,我们将深入探讨什么是空投,以及它在加密世界中扮演的角色。 什么是空投? 空投是指在加密…

2.18号c++

1.菱形继承 1.1 概念 菱形继承又称为钻石继承,是由公共基类派生出多个中间子类,又由多个中间子类共同派生出汇聚子类。汇聚子类会得到多份中间子类从公共基类继承下来的数据成员,会造成空间浪费,没有必要。 问题: …

使用 GitHub Codespaces 加速 Elixir 开发环境工作速度

文章目录 前言加速 Elixir 开发环境参考 前言 使用 Elixir 开发点小玩意的时候,面对经常需要走外网下载依赖 (Elixir 的镜像站 UPYUN 使用有时候也经常抽风) 的时候,为了避免需要不断的进行网络代理配置,有想到之前经常使用 GitHub Codespac…

Spring两大核心思想:IOC和AOP

目录 IOC:控制反转 Ioc概念 Ioc的优点 Spring Ioc AOP:面向切面编程 AOP的优点 Spring AOP 1.添加依赖 2.核心概念 3.通知的类型 4.切点表达式 5.公共切点 pointCut 6.切面优先级 Order 7.使用自定义注解完成AOP的开发 Spring AOP实现有几种方式? S…

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:http://t.csdnimg.cn/eCa5z 目录 类的6个默认成员函数 构造函数 特性 析构函数 特性 析构的顺序 拷贝构造函数 特性 常引用 前言 &…

家用电器液位开关有哪些

在当代家庭中,随着科技的进步和生活水平的提升,各种智能化家用电器成为家庭生活的重要组成部分。这些家用电器如空调、除湿机、加湿器、洗碗机、净水器等,在运作过程中往往需要对液体的高低位进行精确控制,以保证其正常、高效的运…

SpringBoot + Nacos 实现动态化线程池

1.背景 在后台开发中,会经常用到线程池技术,对于线程池核心参数的配置很大程度上依靠经验。然而,由于系统运行过程中存在的不确定性,我们很难一劳永逸地规划一个合理的线程池参数。 在对线程池配置参数进行调整时,一…

BioTech - 交联质谱 (Crosslinks) 的常见数据格式说明

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/136190750 交联质谱 (Crosslinking Mass Spectrometry,Crosslinks) 技术 是一种结合化学交联剂和质谱仪的方法,用于研究蛋…

第十篇:node处理404和服务器错误

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录</

Vue3+vite搭建基础架构(10)--- 使用less和vite-plugin-vue-setup-extend

Vue3vite搭建基础架构&#xff08;10&#xff09;--- 使用less和vite-plugin-vue-setup-extend 说明官方文档安装less测试less表达式安装vite-plugin-vue-setup-extend 说明 这里记录下自己在Vue3vite的项目使用less来写样式以及使用vite-plugin-vue-setup-extend直接定义组件…

【8】知识加工

一、概述 对信息抽取/知识融合后得到的“事实”进行知识推理以拓展现有知识、得到新知识。 知识加工主要包括三方面内容&#xff1a;本体构建、知识推理和质量评估。 二、本体构建 1.本体 定义&#xff1a;本体是用于描述一个领域的术语集合&#xff0c;其组织结构是层次结…

设计模式四:适配器模式

1、适配器模式的理解 适配器模式可以理解为有两个现成的类Adaptee和Target&#xff0c;它们两个是不能动的&#xff0c;要求必须使用B这个类来实现一个功能&#xff0c;但是A的内容是能复用的&#xff0c;这个时候我们需要编写一个转换器 适配器模式 Adaptee&#xff1a;被适…

Java Web(一)--介绍

Java Web 技术体系图 三大组成部分&#xff1a; 前端&#xff1a; 前端开发技术工具包括三要素&#xff1a;HTML、CSS 和 JavaScript&#xff1b;其他高级的前端框架&#xff0c;如bootstrap、jquery&#xff0c;VUE 等。 后端&#xff1a; 后端开发技术工具主要有&am…

剑指offer刷题笔记-链表

少年何妨梦摘星 敢挽桑弓射玉衡 解决与链表相关的问题总是有大量的指针操作&#xff0c;而指针操作的代码总是容易出错的。很多面试官喜欢出与链表相关的问题&#xff0c;就是想通过指针操作来考察应聘者的编码功底。 题目链接来自于 AcWing 、Leetcode&#xff08;LCR&#xf…

燃气企业须知 :智慧燃气信息化管理平台的作用 ?

关键词&#xff1a;智慧燃气、燃气信息化、智慧燃气平台、智慧燃气建设、智慧燃气解决方案 智慧燃气信息化管理平台通过城市输气管网作为主要基础&#xff0c;各个终端用户进行协调&#xff0c;依托信息化数据进行管理&#xff0c;从而让整个工作环节流程达到高效智能优势。通…

【LeetCode】树的BFS(层序遍历)精选6题

目录 1. N 叉树的层序遍历&#xff08;中等&#xff09; 2. 二叉树的锯齿形层序遍历&#xff08;中等&#xff09; 3. 二叉树的最大宽度&#xff08;中等&#xff09; 4. 在每个树行中找最大值&#xff08;中等&#xff09; 5. 找树左下角的值&#xff08;中等&#xff09…

leetcode(动态规划)53.最大子数组和(C++详细解释)DAY12

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 提示 2.解答思…

数论 - 博弈论(Nim游戏)

文章目录 前言一、Nim游戏1.题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 2.算法 二、台阶-Nim游戏1.题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 2.算法 三、集合-Nim游戏1.题目描述输入格式输出格式数据范围输…

vue使用Nprogress进度条功能实现

下图中的这种顶部进度条是非常常见的&#xff0c;在vue项目中有对应的插件&#xff1a;Nprogress。 实现效果&#xff1a; csdn也在使用&#xff1a; 或者这样自己使用 1、安装 NProgress可以通过npm安装。 npm install --save nprogress 注意此处的--save等同于-s,就是将…