QStyle 自定义QSpinBox外观

2023-11-19

点击查看详细介绍

 

头文件

#ifndef SPINBOX_STYLE_1_H
#define SPINBOX_STYLE_1_H

#include <QProxyStyle>
#include <QStyleOptionComplex>
#include <QPainter>

class spinbox_1 : public QProxyStyle
{
    Q_OBJECT

public:
    spinbox_1();
    ~spinbox_1();

public:
    void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const;
    void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
    QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const;

private:
    void drawSpinBox(SubControl sc,const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0)const;


};

#endif // SPINBOX_STYLE_1_H

cpp

#include "spinbox_style_1.h"
#include <QDebug>

spinbox_1::spinbox_1()
{
}

spinbox_1::~spinbox_1()
{

}

void spinbox_1::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
    if(control == CC_SpinBox)
    {
        drawSpinBox(SC_SpinBoxDown,option,painter,widget);
        drawSpinBox(SC_SpinBoxUp,option,painter,widget);

        QRect editFiled = subControlRect(CC_SpinBox,option,SC_SpinBoxEditField,widget).adjusted(-10,-10,+10,+10);
        painter->save();
        QLinearGradient ga(0,0,editFiled.width(),editFiled.height());
        ga.setColorAt(0.0,QColor("#381FE4"));
        ga.setColorAt(1.0,QColor("#99EC93"));
        painter->setBrush(ga);
        painter->setPen(Qt::NoPen);

        int diameter =12;
        QRect roundRect = editFiled.adjusted(1,1,-1,-1);
        int cx = 100 * diameter / roundRect.width();
        int cy = 100 * diameter / roundRect.height();

        painter->drawRoundedRect(roundRect,cx,cy);//绘制编辑框四周
        painter->restore();

        QRect frameRect = subControlRect(CC_SpinBox,option,SC_SpinBoxFrame,widget);
        painter->save();
        painter->setPen(QPen(QColor(Qt::blue),2));
        painter->drawRect(frameRect);//绘制SpinBox外围边框
        painter->restore();
    }
    else
    {
        QProxyStyle::drawComplexControl(control,option,painter,widget);
    }
}

void spinbox_1::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{
    if(element == PE_IndicatorSpinPlus)
    {
        painter->save();
        painter->translate(option->rect.x(),option->rect.y());
        QPainterPath pa;
        pa.moveTo(option->rect.width()/2,0);
        pa.lineTo(0,option->rect.height());
        pa.lineTo(option->rect.width(),option->rect.height());
        pa.lineTo(option->rect.width()/2,0);
        painter->setPen(QPen(QColor("#128bf1"), 2));
        painter->drawPath(pa);
        painter->restore();
        return;
    }
    else if(element == PE_IndicatorSpinMinus)
    {
        painter->save();
        painter->translate(option->rect.x(),option->rect.y());
        QPainterPath pa;
        pa.moveTo(0,0);
        pa.lineTo(option->rect.width(),0);
        pa.lineTo(option->rect.width()/2,option->rect.height());
        pa.lineTo(0,0);
        painter->setPen(QPen(QColor("#128bf1"), 2));
        painter->drawPath(pa);
        painter->restore();
        return;
    }
    return QProxyStyle::drawPrimitive(element,option,painter,widget);
}

QRect spinbox_1::subControlRect(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QStyle::SubControl sc, const QWidget *widget) const
{
    if(cc == CC_SpinBox)
    {
        switch (sc) {
        case SC_SpinBoxUp:
            return QRect(opt->rect.x(),0,opt->rect.width()/2,opt->rect.height()*0.4).adjusted(1,1,-1,-1);
        case SC_SpinBoxDown:
            return QRect(opt->rect.width()/2,0,opt->rect.width()/2,opt->rect.height()*0.4).adjusted(1,1,-1,-1);
        case SC_SpinBoxEditField:
            return QRect(opt->rect.x(),opt->rect.height()*0.4,opt->rect.width(),opt->rect.height()*0.6).adjusted(10,10,-10,-10);
        case SC_SpinBoxFrame:
            return opt->rect;
        default:
            break;
        }
    }
    return QProxyStyle::subControlRect(cc,opt,sc,widget);
}

void spinbox_1::drawSpinBox(QStyle::SubControl sc, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
    QRect buttonRect = option->rect;
    PrimitiveElement pe;
    if(sc == SC_SpinBoxUp)
    {
        pe = PE_IndicatorSpinPlus;
        buttonRect.translate(0,0);
    }
    else
    {
        pe = PE_IndicatorSpinMinus;
        buttonRect.translate(option->rect.width()/2,0);
    }
    buttonRect.setWidth(option->rect.width()/2);
    buttonRect.setHeight(option->rect.height()*0.4);

    painter->save();
    painter->setClipRect(buttonRect);

   // painter->setPen(Qt::NoPen);
    QLinearGradient gradient(0,0,0,option->rect.height());
    gradient.setColorAt(0.0,QColor("#5ee7df"));
    gradient.setColorAt(1.0,QColor("#b490ca"));
    painter->setBrush(gradient);
    QRect bgRect = buttonRect.adjusted(1,1,-1,-1);
    int diameter = 12;
    int cx = 100 * diameter / buttonRect.width();
    int cy = 100 * diameter / buttonRect.height();
    painter->drawRoundedRect(bgRect,cx,cy);

    QPoint p = widget->mapFromGlobal(QCursor::pos());//鼠标点击位置转换

    if(option->state &(State_On | State_Sunken)&&bgRect.contains(p))//鼠标按下位置
    {
        QColor pressColor(0,0,0,63);
        painter->setBrush(pressColor);
        painter->drawRoundedRect(bgRect,cx,cy);
    }
    painter->restore();

    QStyleOption plusIcon(*option);
    QRect subRect = subControlRect(CC_SpinBox,option,sc,widget);
    plusIcon.rect = subRect.adjusted(subRect.width()*0.3,subRect.height()*0.3,-subRect.width()*0.3,-subRect.height()*0.3);

    drawPrimitive(pe,&plusIcon,painter,widget);
   // QProxyStyle::drawPrimitive(pe,&plusIcon,painter,widget);

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QStyle 自定义QSpinBox外观 的相关文章

  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因

随机推荐

  • 抗击疫情,AI可以做些什么?

    目前 新冠疫情的发展 可以说无时无刻不在牵动着大家的心 在这样的历史背景下 作为人工智能 数据科学领域的从业者 我们不妨来探讨一下 AI在遏制类似的疾病传播中 可以起到什么样的作用 当然 单纯靠AI技术确实无法让病毒停止传播 在一定时期内
  • STM32的单脉冲模式实现精确个数脉冲

    我们在做嵌入式产品的开发过程中 有时需要输出指定数目的脉冲 实现它的方法较多 这里介绍一种利用 STM32定时器的单脉冲模式来实现的方法 STM32定时器的单脉冲输出功能 其实是定时器输出比较功能的一个特殊应用 即让定时器在某个事件触发后的
  • keil mdk代码提示与代码补全设置

    主要参考https blog csdn net w5862338 article details 50520423 结合自己的实际问题 一旦习惯了一些实用的功能 当进入到类似的环境中而没有熟悉的功能 会觉得很不方便 代码提示与补全就是这样实
  • 60-400-045-使用-binlog-Maxwell读取MySQL binlog日志到Kafka

    文章目录 启动MySQL 创建maxwell的数据库和用户 在MySQL中创建一个测试数据库和表 启动Zookeeper 启动kafka 并创建主题为maxwell的topic 启动kafaka的消费者 检查数据是否到位 启动maxwell
  • [网络安全]sqli-labs Less-17 解题详析

    考察报错注入 本文使用extractvalue进行注入 原理及姿势可参考 网络安全 sqli labs Less 5 解题详析 判断注入类型 由以下回显可知 注入类型为单引号注入 查库名 账号输入admin 密码输入 1 and extra
  • Visual C++6.0的安装及使用教程

    Visual C 6 0下载链接 链接 https pan baidu com s 18ubNr9Gor3GbRrAkJe612w 密码 piek 对刚学习C语言或C 的小伙伴们来说 一款简单好用的编译器必不可少 今天给大家介绍的是Visu
  • 深度学习小白——DenseNet学习

    原论文地址 https arxiv org abs 1608 06993 用Keras写的pre model代码地址 https github com flyyufelix DenseNet Keras 一 主要原理 其借鉴了ResNet的
  • 深度学习如何集成领域知识?IBM研究等《知识增强深度学习》综述,全面阐述科学与经验知识增强的深度学习...

    来源 专知 尽管在过去的几年里 深度学习模型在许多不同的领域取得了巨大的成功 但通常数据匮乏 在不可见的样本上表现不佳 而且缺乏可解释性 目标领域往往存在各种先验知识 利用这些先验知识可以弥补深度学习的不足 为了更好地模仿人类大脑的行为 人
  • 下面是两种解决Redis击穿问题的方法,并给出相应的Java代码实现。

    Redis击穿问题指的是当一个key在缓存中过期时 恰好有大量并发请求访问该key 导致请求直接打到数据库 引起数据库压力过大 甚至宕机 方法一 使用互斥锁 在访问缓存之前 首先获取一个互斥锁 防止多个请求同时访问数据库 只有一个请求可以访
  • 转 用十条命令在一分钟内检查Linux服务器性能

    如果你的Linux服务器突然负载暴增 告警短信快发爆你的手机 如何在最短时间内找出Linux性能问题所在 来看Netflix性能工程团队的这篇博文 看它们通过十条命令在一分钟内对机器性能问题进行诊断 概述 通过执行以下命令 可以在1分钟内对
  • 开发百度地图定位APP(LBS)

    一 注册成为百度地图开发者 并获取开发密钥 获取密钥时需要进入Android studio使用keytool文件获取SHA1码 二 下载开发包解压并导入Android studio 选择自己需要的开发包下载 这里我选择的是基础地图基础定位J
  • C#类和对象--习题(2)成绩管理

    老师口中说 少用static 然后有习题要我们用static来写 实现简单学生成绩管理 两个类 方法带static 1 学生及信息录入 id name grade 2 输出成绩 3 修改成绩 4 查询成绩 5 显示成绩 6 退出系统 Met
  • 卓越性能代码_教你Win10启用卓越性能模式,效果明显!

    本文授权转载自公众号 labulac 当Windows 10更新到内部版本17333后 一些朋友可能发现 以往电源管理模式有节能 标准和高性能三个选项 现在装完系统默认启用的是标准选项 剩下的两个模式被隐藏了 当然我们也可以将这些电源模式找
  • Vue插槽用法,在JSX中的用法

    注意 scopedSlots会包含 slots里面的内容 所以我们两个一起使用的时候 名字要不一样 scopedSlots 里面的属性值是函数 可以调用这个函数进行渲染 scopedSlots会包含 slots slots 里面的属性值是一
  • Java如何设置线程的优先级呢?

    转自 Java如何设置线程的优先级呢 线程 thread 是操作系统能够进行运算调度的最小单位 它被包含在进程之中 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 一个进程中可以并发多个线程 每条线程并行执行不同的任务 在
  • 从零开始搭建uni-app框架的小程序开发环境

    个人主页 个人主页 推荐专栏 小程序开发成神之路 作者简介 一个读研中创业 打工中学习的能搞全栈 也搞算法 目前在搞大数据的奋斗者 您的小小关注是我持续输出的动力 文章目录 一 小程序账号的开通 1 注册小程序账号 2 获取小程序身份证 A
  • 寒假小复习2

    package demo public class Demo public static void main String args int i 2 switch i case 1 System out println System out
  • Pytorch学习笔记(二)

    后续遇到一些函数等知识 还会进行及时的补充 tensor的创建 使用pytorch中的列表创建tensor tensor torch Tensor 1 1 0 2 print
  • python 基础

    条件表达式 if 1 gt 2 print 111 elif 2 gt 3 print 222 else print 333 for循环 for i in range 3 10 print i 输出结果 for循环 步长为2 for i i
  • QStyle 自定义QSpinBox外观

    点击查看详细介绍 头文件 ifndef SPINBOX STYLE 1 H define SPINBOX STYLE 1 H include