首页 > 其他分享 >高亮按钮

高亮按钮

时间:2024-12-02 17:12:38浏览次数:5  
标签:QColor Widget 高亮 void radius QPainter 按钮 painter

1.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
protected:
    void paintEvent(QPaintEvent *event);
    void drawBorderOut(QPainter *painter);
    void drawBg(QPainter *painter);
    void drawText(QPainter *painter);
    void drawOverlay(QPainter *painter);
    void drawBorderIn(QPainter *painter);
private:
    Ui::Widget *ui;
    QColor borderOutColorStart;     //外边框渐变开始颜色
    QColor borderOutColorEnd;       //外边框渐变结束颜色
    QColor borderInColorStart;      //里边框渐变开始颜色
    QColor borderInColorEnd;        //里边框渐变结束颜色
    QColor bgColor;                 //背景颜色
    bool showOverlay;               //是否显示遮罩层
    QColor overlayColor;            //遮罩层颜色
};

#endif // WIDGET_H

 2.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    setWindowFlags(Qt::FramelessWindowHint);

    borderOutColorStart = QColor(255, 255, 255);//纯白
    borderOutColorEnd = QColor(166, 166, 166);//一点黑
//    borderOutColorEnd = QColor(0,0,0);
    borderInColorStart = QColor(166, 166, 166);//一点黑
    borderInColorEnd = QColor(255, 255, 255);//纯白

    bgColor = QColor(100, 184, 255);//蓝色
    showOverlay = true;
    overlayColor = QColor(255, 255, 255);//白色
 //   overlayColor = QColor(0,0,0);//黑色
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    int width = this->width();
    int height = this->height();
    int side = qMin(width, height);//宽和高的最小值

    //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
    QPainter painter(this);
    //绘图抗锯齿,绘制字体抗锯齿
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    //移至中点
    painter.translate(width / 2, height / 2);
    //坐标系统缩放
    painter.scale(side / 200.0, side / 200.0);
    //比例大于1放大,小于1缩小
    //等价于在(200*200)的画布下进行绘图


//    //绘制外边框
    drawBorderOut(&painter);
//    //绘制内边框
    drawBorderIn(&painter);
//    //绘制内部指示颜色
    drawBg(&painter);
//    //绘制遮罩层
    drawOverlay(&painter);
//    //没有遮罩层,就是纯纯的颜色
}

void Widget::drawBorderOut(QPainter *painter)
{
    int radius = 99;
    painter->save();
    painter->setPen(Qt::NoPen);
    //QLinearGradient(qreal x1, qreal y1, qreal x2, qreal y2)
    QLinearGradient borderGradient(0, -radius, 0, radius);
    borderGradient.setColorAt(0, borderOutColorStart);
    borderGradient.setColorAt(1, borderOutColorEnd);
    painter->setBrush(borderGradient);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}
void Widget::drawBorderIn(QPainter *painter)
{
    int radius = 90;
    painter->save();
    painter->setPen(Qt::NoPen);
    QLinearGradient borderGradient(0, -radius, 0, radius);
    borderGradient.setColorAt(0, borderInColorStart);
    borderGradient.setColorAt(1, borderInColorEnd);
    painter->setBrush(borderGradient);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}
void Widget::drawBg(QPainter *painter)
{
    int radius = 80;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(bgColor);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}
void Widget::drawOverlay(QPainter *painter)
{
    if (!showOverlay) {
        return;
    }

    int radius = 80;
    painter->save();
    painter->setPen(Qt::NoPen);

    QPainterPath smallCircle;
    QPainterPath bigCircle;
    radius -= 1;
    smallCircle.addEllipse(-radius, -radius, radius * 2, radius * 2);
    radius *= 2;
    bigCircle.addEllipse(-radius, -radius + 140, radius * 2, radius * 2);


//    painter->drawPath(smallCircle);
//    painter->setBrush(Qt::blue);
//    painter->drawPath(bigCircle);
    //高光的形状为小圆扣掉大圆的部分
    QPainterPath highlight = smallCircle - bigCircle;

    //QPainterPath highlight = smallCircle;
//    QPainterPath highlight = bigCircle;
    QLinearGradient linearGradient(0, -radius / 2, 0, 0);
    overlayColor.setAlpha(255);
    linearGradient.setColorAt(0.0, overlayColor);
    overlayColor.setAlpha(0);
    linearGradient.setColorAt(1.0, overlayColor);
    painter->setBrush(linearGradient);
    painter->rotate(-20);
    painter->drawPath(highlight);

    painter->restore();
}

 3.结果

 

标签:QColor,Widget,高亮,void,radius,QPainter,按钮,painter
From: https://www.cnblogs.com/wuyuan2011woaini/p/18582233

相关文章

  • 帝国CMS用PHP调用栏目导航标签并高亮简单版
    <?php$sql=$empire->query("selectclassid,sonclass,classname,islast,islistfrom{$dbtbpre}enewsclasswherebclassid=0andshowclass=0orderbymyorder,myorderasc");while($s=$empire->fetch($sql)){$classurl=sys_ReturnBqClas......
  • typora 无限试用去除弹窗修改未激活按钮
    typora无限试用|去除弹窗|修改未激活按钮改注册表无限试用start.bat文件@echooffsetlocalenabledelayedexpansionchcp65001>nulREM获取当前日期,格式为MM/dd/yyyyfor/f"delims="%%ain('wmicOSGetlocaldatetime^|find"."')dosetdatetime=%%ase......
  • 如果要你实现一个代码(多种语言)高亮的组件,你的思路是什么?
    要实现一个前端代码高亮组件,我的思路如下:1.选择合适的库或工具:成熟的库:优先考虑使用现有的成熟库,可以节省大量开发时间和精力,并获得更好的性能和兼容性。一些流行的选择包括:highlight.js:轻量级,支持多种语言,易于集成,客户端渲染。Prism.js:轻量级,可扩展,支持多种语言,......
  • HTML5如何隐藏video元素的控制栏、全屏按钮?
    要隐藏HTML5video元素的控制栏和全屏按钮,您可以使用以下几种方法:1.使用controlsList属性(推荐):这是最灵活和推荐的方法,因为它允许你精细地控制哪些控件显示或隐藏。你可以使用nofullscreen来禁用全屏按钮,并使用nodownload来禁用下载按钮(如果浏览器支持)。<videocont......
  • 关于Quartus的start按钮灰色无法下载的问题的解决
    Quartus的start按钮灰色可能一首先记得连接实验板并且添加.sof文件点击HardwareSetup选择USB-Blaster即可可能二如果上面的找不到USB-Blaster,可进入电脑的设备管理器,找到其他设备中的USB-Blaster选项右击更新驱动,注意选择相应路径更新完成后再次回到Quartus应该就可以......
  • Latex高亮文本,简单有效——overleaf也可以用
    https://blog.csdn.net/ShuqiaoS/article/details/118217508普通文本高亮效果是这样的:首先在开头使用:\usepackage{soul,color,xcolor}之后在需要高亮的地方使用:\hl{文本}(注意,如果应用了\hl但是没有反应或者高亮有问题,多半是由于没有包含color和xcolor的缘故)如果希望修......
  • 【泛微E9】移动应用将页面按钮置灰
    效果如下:实现方法:$load(function(){setTimeout(function(){varkpbm=$f("kpbm").val();varzcbm=$f("zcbm").val();constdate=newDate();constyear=date.getFullYear();......
  • 创建一个点击后背景有扩散效果的按钮
    文章目录概要效果展示主要步骤主要代码小结概要创建一个点击后背景有扩散效果的按钮。效果展示主要步骤1、自定义控件样式2、自定义Convert3、使用ScaleTransform主要代码按钮自定义样式<Stylex:Key="buttonStyle"TargetType="Button"><SetterProp......
  • # vue 实现关键字高亮效果
    vue实现关键字高亮效果这是啥子意思呢,就是类似于百度搜索,根据关键词搜索结果,搜索结果中,与关键词相同的字显示红色,仅此而已,没有什么大的功能。简单写一下demo。环境我使用的是vue3+ts的语法来写,其实一个样儿,关键代码js、ts都可以,就一个方法,调用一下就可以了。<templat......
  • 银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法
    银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法1、支持环境2、详细操作说明步骤1:用root账户登录电脑步骤2:导航到kylin-wm-chooser目录步骤3:编辑default.conf文件步骤4:重启电脑3、结语......