Qt 自绘开关按钮以及设计器中的提升为用法

文章目录

自绘按钮实现

概要

  • 当我们需要一个开关样式的QPushbutton,没有图片的话,我们可以采用自绘的形式实现。
  • 且使用QtDesinger中提升为Promote to的功能加入界面中,而不是使用代码的方式。

效果图

代码

  • 代码相对简单,主要看一下绘制的实现
cpp 复制代码
void SwitchButton::paintEvent(QPaintEvent *event)
{
    QPushButton::paintEvent(event); // 调用基类的绘制事件

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 定义滚珠的半径
    qreal ballRadius = height() * 0.4; // 可以根据需要调整滚珠大小
    qreal padding = (height() - ballRadius * 2) / 2; // 按钮内部边距

    // 绘制按钮的背景
    QRectF rect(padding, padding, width() - padding * 2, height() - padding * 2);
    painter.setPen(Qt::NoPen);
    if(m_isAutoMode){
        painter.setBrush(QColor(33, 51, 107));
    }else{
        painter.setBrush(QColor(25, 127, 224));
    }
    painter.drawRoundedRect(rect, ballRadius, ballRadius); // 使用滚珠半径作为圆角半径

    // 绘制圆形滚珠
    qreal ballPosition = m_isAutoMode ? rect.width() - ballRadius * 2 : 0;
    QRectF ballRect(ballPosition + padding, padding, ballRadius * 2, ballRadius * 2);

    // 设置滚珠的渐变色
    qreal gradientCenterX = ballPosition + padding + ballRadius;
    qreal gradientCenterY = padding + ballRadius;
    QRadialGradient gradient(gradientCenterX, gradientCenterY, ballRadius);
    gradient.setColorAt(0, QColor(25, 127, 224));
    gradient.setColorAt(1, QColor(33, 51, 107));
    painter.setBrush(gradient);
    painter.drawEllipse(ballRect);

    // 绘制文本
    painter.setPen(Qt::white);
    QString text = m_isAutoMode ? "自动模式" : "手动模式";
    painter.drawText(rect, Qt::AlignCenter, text);
}

'提升为'用法

介绍

  • 在Qt设计器中,它允许用户将一个标准Qt Widget转换为自定义的QWidget子类。这样,用户可以在设计器中使用自己的控件,同时还能在代码中添加额外的功能或属性。

步骤

  1. 随便拖入一个按钮到设计器中
  2. 右键它,找到'提升为'选项
  3. 填入已经实现的类,点击添加,添加完成后就可以选择提升

总结

  • 知识理应共享,源码在此
  • 提升为用起来还是很方便的,可以大大减少代码量以及提高阅读效率
相关推荐
Mr.Pascal4 分钟前
刚学php序列化/反序列化遇到的坑(攻防世界:Web_php_unserialize)
开发语言·安全·web安全·php
小尤笔记16 分钟前
利用Python编写简单登录系统
开发语言·python·数据分析·python基础
秦老师Q19 分钟前
Java基础第九章-Java集合框架(超详细)!!!
java·开发语言
计算机毕设源码qq-383653104120 分钟前
(附项目源码)Java开发语言,215 springboot 大学生爱心互助代购网站,计算机毕设程序开发+文案(LW+PPT)
java·开发语言·spring boot·mysql·课程设计
无尽的大道31 分钟前
深入理解 Java 阻塞队列:使用场景、原理与性能优化
java·开发语言·性能优化
建群新人小猿36 分钟前
会员等级经验问题
android·开发语言·前端·javascript·php
007php0071 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang
数据小小爬虫1 小时前
如何利用Java爬虫获得1688店铺详情
java·开发语言
Tech Synapse1 小时前
Python网络爬虫实践案例:爬取猫眼电影Top100
开发语言·爬虫·python
biomooc1 小时前
R语言/Rstudio 报错
开发语言·r语言