Qt自定义步骤引导按钮

1. 步骤引导按钮


实际在开发项目过程中,由一些流程比较繁琐,为了给客户更好的交互体验,往往需要使用step1->step2这种引导对话框或者引导按钮来引导用户一步步进行设置;话不多说,先上效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 实现原理


实现起来其实也并不复杂,主要是对外接口可以设置多个标题文本,以及当前高亮显示的索引即可

void setTitles(const QStringList &titles);
void setCurStep(int idx);

3.核心绘制代码


void StepGuideButton::paintEvent(QPaintEvent *ev)
{
    if (m_nSteps == 0) {
        return QWidget::paintEvent(ev);
    }

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);

    int w = this->width();
    int h = this->height();

    int wStepWidth = (w - (m_nLinks * LINK_WIDTH)) / m_nSteps;

    // 绘制背景
    painter.setPen(Qt::NoPen);
    painter.setBrush(m_background);
    painter.drawRoundedRect(QRect(0, 0, w, h), ROUND_RADIUS, ROUND_RADIUS);

    // 绘制连接点
    for (int i = 0; i < m_nLinks; ++i) {
        painter.setPen(Qt::white);
        painter.setBrush(Qt::white);
        QPointF ptList[6];
        ptList[0].setX((i + 1) * wStepWidth + i * LINK_WIDTH);
        ptList[0].setY(0);

        ptList[1].setX((i + 1) * wStepWidth + i * LINK_WIDTH + (LINK_WIDTH * 1.0 / 2));
        ptList[1].setY(0);

        ptList[2].setX((i + 1) * wStepWidth + (i + 1) * LINK_WIDTH);
        ptList[2].setY(h / 2.0);

        ptList[3].setX((i + 1) * wStepWidth + i * LINK_WIDTH + (LINK_WIDTH * 1.0 / 2));
        ptList[3].setY(h);

        ptList[4].setX((i + 1) * wStepWidth + i * LINK_WIDTH);
        ptList[4].setY(h);

        ptList[5].setX((i + 1) * wStepWidth + i * LINK_WIDTH + (LINK_WIDTH * 1.0 / 2));
        ptList[5].setY(h / 2.0);
        painter.drawPolygon(ptList, 6);
    }

    // 绘制高亮
    painter.setPen(Qt::NoPen);
    painter.setBrush(m_highLight);
    if (m_curIdx == 0 || m_curIdx == m_titles.size() - 1) {
        int tempIdx = m_curIdx > 0 ? m_curIdx : 0;
        painter.drawRoundedRect(QRect(m_curIdx * wStepWidth + tempIdx * LINK_WIDTH, 0, wStepWidth + tempIdx, h), ROUND_RADIUS, ROUND_RADIUS);
        QPointF ptList[5];
        if (m_curIdx == 0) {
            ptList[0].setX(wStepWidth / 2.0);
            ptList[0].setY(0);

            ptList[1].setX(wStepWidth);
            ptList[1].setY(0);

            ptList[2].setX(wStepWidth + LINK_WIDTH / 2.0);
            ptList[2].setY(h / 2.0);

            ptList[3].setX(wStepWidth);
            ptList[3].setY(h);

            ptList[4].setX(wStepWidth / 2.0);
            ptList[4].setY(h);;
        } else {
            ptList[0].setX(m_curIdx * (wStepWidth + LINK_WIDTH) - LINK_WIDTH / 2.0);
            ptList[0].setY(0);

            ptList[1].setX(m_curIdx * (wStepWidth + LINK_WIDTH) + wStepWidth / 2.0);
            ptList[1].setY(0);

            ptList[2].setX(m_curIdx * (wStepWidth + LINK_WIDTH) + wStepWidth / 2.0);
            ptList[2].setY(h);

            ptList[3].setX(m_curIdx * (wStepWidth + LINK_WIDTH) - LINK_WIDTH / 2.0);
            ptList[3].setY(h);

            ptList[4].setX(m_curIdx * (wStepWidth + LINK_WIDTH));
            ptList[4].setY(h / 2.0);
        }
        painter.drawPolygon(ptList, 5);
    } else {
        QPointF ptList[6];
        ptList[0].setX(m_curIdx * (wStepWidth + LINK_WIDTH) - LINK_WIDTH / 2.0);
        ptList[0].setY(0);

        ptList[1].setX(m_curIdx * (wStepWidth + LINK_WIDTH) + wStepWidth);
        ptList[1].setY(0);

        ptList[2].setX(m_curIdx * (wStepWidth + LINK_WIDTH) + wStepWidth + LINK_WIDTH / 2.0);
        ptList[2].setY(h / 2.0);

        ptList[3].setX(m_curIdx * (wStepWidth + LINK_WIDTH) + wStepWidth);
        ptList[3].setY(h);

        ptList[4].setX(m_curIdx * (wStepWidth + LINK_WIDTH) - LINK_WIDTH / 2.0);
        ptList[4].setY(h);

        ptList[5].setX(m_curIdx * (wStepWidth + LINK_WIDTH));
        ptList[5].setY(h / 2.0);
        painter.drawPolygon(ptList, 6);
    }

    // 绘制文本
    painter.setPen(m_text);
    for (int i = 0; i < m_nSteps; ++i) {
        painter.drawText(QRect(i * wStepWidth + (i > 0 ? i * LINK_WIDTH : 0), 0, wStepWidth, h), Qt::AlignCenter, m_titles[i]);
    }
}

4.完整代码


https://download.csdn.net/download/SuperYang_/90194962

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

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

相关文章

《Java核心技术II》流中的filter、map和flatMap方法

filter、map和flatMap方法 filter filter通过转换产生过滤后的新流,将字符串流转化为只包含长单词的另一个流。 List words ...; Stream longWords words.stream().filter(w->w.length()>12) filter类型是Predicate(谓词&#xff0c;表示动作)类型对象&#xff0c…

Junit4单元测试快速上手

文章目录 POM依赖引入业务层测试代码Web层测试代码生成测试类文件 在工作中我用的最多的单元测试框架是Junit4。通常在写DAO、Service、Web层代码的时候都会进行单元测试&#xff0c;方便后续编码&#xff0c;前端甩锅。 POM依赖引入 <dependency><groupId>org.spr…

FPGA自学之路:到底有多崎岖?

FPGA&#xff0c;即现场可编程门阵列&#xff0c;被誉为硬件世界的“瑞士军刀”&#xff0c;其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度&#xff0c;不少人望而却步。那么&#xff0c;FPGA自学之路到底有多崎岖呢&#xff1f; 几座大山那么高&#xff1f;…

【Leecode】Leecode刷题之路第97天之交错字符串

题目出处 97-交错字符串-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 97-交错字符串-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; class Solution {public boolean isInte…

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。动图演示&#xff1a; 在微服务系统…

使用 Three.js 创建几何体粒子效果

今天,带大家一起看下如何将几何体由粒子组成的效果。 通常情况下&#xff0c;Three.js 中的几何体材质会为每个面赋予一种颜色&#xff0c;这样的结果比较常见&#xff0c;如下图所示&#xff1a; 然而&#xff0c;通过将几何体由粒子组成&#xff0c;我们可以实现更加酷炫和…

shell指令

终端输入一个C源文件名&#xff08;.c结尾&#xff09;判断文件是否有内容&#xff0c;如果没有内容删除文件&#xff0c;如果有内容编译并执行改文件。 终端输入两个文件名&#xff0c;判断那个时间戳更新

使用ONVIF操纵大华摄像头

使用1台大华网络相机&#xff0c;DH-IPC-HFW3237M-I2&#xff0c;6毫米镜头&#xff0c;2百万像素&#xff0c;但是网口是百兆的。 大华的SDK感觉好难用。 写完了data matrix识别的0.1版本后&#xff0c;进行相机部分改进。 老规矩&#xff0c;先用python快速原型。 会出现一个…

Pandas-数据分组

文章目录 一. 分组聚合1. 分组聚合过程2. Pandas,Numpy内置的聚合方法3. 聚合函数① 使用Numpy库的mean函数② 自定义函数Ⅰ. 一个参数Ⅱ. 多个参数 ③ agg和 aggregateⅠ. 传入一个函数Ⅱ. 同时传入多个函数Ⅲ. 向agg/aggregate中传入字典 二. 分组转换1. 使用transform分组计…

云计算课程报告实验-WordCount算法实验 过程记录

内容描述 本实验指导书通过在华为鲲鹏上&#xff0c;编译运行WordCount程序。完成实验操作后&#xff0c;读者会掌握简单的程序编写&#xff0c;如WordCount中的getWords、countWords、treeMerge。 实验环境 华为鲲鹏云主机、openEuler 20.03操作系统&#xff1b;安装mpich-3…

【paddle】初次尝试

张量 张量是 paddlepaddle&#xff0c; torch&#xff0c; tensorflow 等 python 主流机器学习包中唯一通货变量&#xff0c;因此应当了解其基本的功能。 张量 paddle.Tensor 与 numpy.array 的转化 import paddle as paddle import matplotlib.pyplot as plt apaddle.to_t…

Frontend - 分页(针对 python / Django )

目录 一、同个文件内&#xff08;方式一&#xff09; 1. 前端 html 2. 定义分页界面 3. 获取分页数据 4.后端根据前端分页需求&#xff0c;整理分页数据 5.显示情况 6. JsonResponse 相关知识 二、不同文件内依旧有效&#xff08;方式二&#xff0c;更优化&#xff09;…

骑行解压:身心的奇妙之旅,VELO Angel Revo坐垫

在快节奏的都市生活中&#xff0c;骑行不仅是一种健康的生活方式&#xff0c;更是一种心灵的释放。从心理生理学的角度来看&#xff0c;骑行能够促使身体分泌内啡肽&#xff0c;带来愉悦感&#xff0c;同时&#xff0c;它还能转移注意力&#xff0c;缓解焦虑。在这场身心的奇妙…

HarmonyOS NEXT 实战之元服务:静态案例效果---教育培训服务

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

使用JMeter对Linux生产服务器进行压力测试

安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言&#xff08;例如&#xff1a;Chinese&am…

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)

【Web安全】文件写入漏洞 ASP 网页病毒模拟&#xff08;文件写入漏洞FilesystemObject&#xff09; 原理 文件写入漏洞 文件写入漏洞是指攻击者通过某种方式在服务器上创建或修改文件的漏洞。攻击者可以利用此漏洞在服务器上写入恶意代码或文件&#xff0c;从而实现进一步的…

微信小程序调用 WebAssembly 烹饪指南

我们都是在夜里崩溃过的俗人&#xff0c;所幸终会天亮。明天就是新的开始&#xff0c;我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen&#xff0c;这是一个 Rust 库和 CLI…

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog&#xff08;1&#xff09;修改MySql配置文件&#xff08;2&#xff09;重启MySql服务,查看配置是否生效&#xff08;3&#xff09;配置起效果后&#xff0c;创建canal用户&#xff0c;并赋予权限安装canal-admin&#xff08;1&#xff09;解压 canal.admin-1…

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片

药片(药丸)和胶囊识别数据集&#xff0c;使用yolo&#xff0c;pasical voc xml, coco json格式标注&#xff0c;可识别药片和胶囊两种标签&#xff0c;2445张原始图片 数据集分割 训练组80&#xff05; 1967图片 有效集13% 317图片 测试集7% 161图片 预处…