zoukankan      html  css  js  c++  java
  • Qt编写自定义控件56-波浪曲线

    一、前言

    波浪曲线控件,其实是之前一个水波进度条控件的一个核心,其实就是利用正弦曲线来生成对应的坐标进行绘制,把这个功能单独提取出来,是为了更详细的研究各种正弦余弦等拓展效果,当时写这个效果的时候,参考的是网上android绘制的水波效果的代码,然后自己重新理解以后,整理成Qt的版本,拓展了部分效果比如可以设置浪的高度,浪的密度,密度越大越浪,_,演示控件效果提供了滑块来设置对应的参数。

    二、实现的功能

    • 1:可设置波浪的速度
    • 2:可设置波浪的高度
    • 3:可设置波浪的密度,密度越大越浪
    • 4:可设置背景颜色
    • 5:可设置波浪颜色

    三、效果图

    四、头文件代码

    #ifndef WAVEPLOT_H
    #define WAVEPLOT_H
    
    /**
     * 正弦曲线控件 作者:feiyangqingyun(QQ:517216493) 2017-2-10
     * 1:可设置波浪的速度
     * 2:可设置波浪的高度
     * 3:可设置波浪的密度,密度越大越浪
     * 4:可设置背景颜色
     * 5:可设置波浪颜色
     */
    
    #include <QWidget>
    
    #ifdef quc
    #if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
    #include <QtDesigner/QDesignerExportWidget>
    #else
    #include <QtUiPlugin/QDesignerExportWidget>
    #endif
    
    class QDESIGNER_WIDGET_EXPORT WavePlot : public QWidget
    #else
    class WavePlot : public QWidget
    #endif
    
    {
        Q_OBJECT
        Q_PROPERTY(int interval READ getInterval WRITE setInterval)
    
        Q_PROPERTY(double waterHeight READ getWaterHeight WRITE setWaterHeight)
        Q_PROPERTY(double waterDensity READ getWaterDensity WRITE setWaterDensity)
    
        Q_PROPERTY(QColor lineColor READ getLineColor WRITE setLineColor)
        Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor)
    
    public:
        explicit WavePlot(QWidget *parent = 0);
        ~WavePlot();
    
    protected:    
        void paintEvent(QPaintEvent *);
        void drawBg(QPainter *painter);
        void drawLine(QPainter *painter);
    
    private:
        int interval;                   //间隔
    
        double waterHeight;             //水波高度
        double waterDensity;            //水波密度
    
        QColor lineColor;               //线条颜色
        QColor bgColor;                 //背景颜色
    
        double offset;                  //水波偏移量
        QTimer *timer;                  //定时器绘制动画
    
    public:
        int getInterval()               const;
    
        double getWaterHeight()         const;
        double getWaterDensity()        const;
    
        QColor getLineColor()           const;
        QColor getBgColor()             const;
    
        QSize sizeHint()                const;
        QSize minimumSizeHint()         const;
    
    public Q_SLOTS:
        //启动波动
        void start();
        //停止波动
        void stop();
    
        //设置波动间隔
        void setInterval(int interval);
    
        //设置水波高度
        void setWaterHeight(double waterHeight);
    
        //设置水波密度
        void setWaterDensity(double waterDensity);
    
        //设置线条颜色
        void setLineColor(const QColor &lineColor);
        //设置背景颜色
        void setBgColor(const QColor &bgColor);
    };
    
    #endif // WAVEPLOT_H
    
    
    

    五、核心代码

    void WavePlot::paintEvent(QPaintEvent *)
    {
        //绘制准备工作,启用反锯齿
        QPainter painter(this);
        painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    
        //绘制背景
        drawBg(&painter);
    
        //绘制波纹
        drawLine(&painter);
    }
    
    void WavePlot::drawBg(QPainter *painter)
    {
        painter->save();
        painter->setBrush(bgColor);
        painter->drawRect(this->rect());
        painter->restore();
    }
    
    void WavePlot::drawLine(QPainter *painter)
    {
        int height = this-> height();
        int width = this->width();
    
        //起始点坐标和结束点坐标
        int startX = 0;
        int startY = 0;
        int endX = width - 0;
        int endY = height - 0;
    
        //计算当前值所占百分比
        double percent = 0.5;
    
        //正弦曲线公式 y = A * qSin(ωx + φ) + k
    
        //w表示周期,可以理解为水波的密度,值越大密度越大(浪越密集 ^_^),取值 密度*M_PI/宽度
        double w = waterDensity * M_PI / endX;
    
        //A表示振幅,可以理解为水波的高度,值越大高度越高(越浪 ^_^),取值高度的百分比
        double A = endY * waterHeight;
    
        //k表示y轴偏移,可以理解为进度,取值高度的进度百分比
        double k = endY * percent;
    
        //第一条波浪路径集合
        QPainterPath waterPath1;
        //第二条波浪路径集合
        QPainterPath waterPath2;
    
        //移动到左上角起始点
        waterPath1.moveTo(startX, endY);
        waterPath2.moveTo(startX, endY);
    
        offset += 0.6;
        if (offset > (endX / 2)) {
            offset = 0;
        }
    
        for(int x = startX; x <= endX; x++) {
            //第一条波浪Y轴
            double waterY1 = (double)(A * qSin(w * x + offset)) + k;
            //第二条波浪Y轴
            double waterY2 = (double)(A * qSin(w * x + offset + (endX / 2 * w))) + k;
    
            //将两个点连接成线
            waterPath1.lineTo(x, waterY1);
            waterPath2.lineTo(x, waterY2);
        }
    
        //移动到右下角结束点,整体形成一个闭合路径
        waterPath1.lineTo(endX, endY);
        waterPath2.lineTo(endX, endY);
    
        QColor waterColor1 = lineColor;
        waterColor1.setAlpha(100);
        QColor waterColor2 = lineColor;
        waterColor2.setAlpha(200);
    
        painter->save();
        painter->setPen(Qt::NoPen);
    
        //第一条波浪路径
        painter->setBrush(waterColor1);
        painter->drawPath(waterPath1);
    
        //第二条波浪路径
        painter->setBrush(waterColor2);
        painter->drawPath(waterPath2);
    
        painter->restore();
    }
    
    

    六、控件介绍

    1. 超过150个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
    2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。
    3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.13的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
    4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
    5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
    6. 每个控件默认配色和demo对应的配色都非常精美。
    7. 超过130个可见控件,6个不可见控件。
    8. 部分控件提供多种样式风格选择,多种指示器样式选择。
    9. 所有控件自适应窗体拉伸变化。
    10. 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。
    11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。
    12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
    13. 所有控件最后生成一个动态库文件(dll或者so等),可以直接集成到qtcreator中拖曳设计使用。
    14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。
    15. 自定义控件插件开放动态库使用(永久免费),无任何后门和限制,请放心使用。
    16. 目前已提供26个版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
    17. 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!
    18. Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》《Qt5编程入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》。
    19. 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!
    20. SDK下载链接:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取码:877p
  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/11561525.html
Copyright © 2011-2022 走看看