zoukankan      html  css  js  c++  java
  • Qt之绘制闪烁文本

    简述

    根据之前的二位绘图,我们可以很轻松的进行文本的绘制,如果需要一些特效,比如:文本闪烁。我们就必须借助其它辅助类来完成。

    原理

    主要涉及两个辅助类:

    • QFontMetrics
      用于获取文本字体的像素高度与宽度

    • QBasicTimer
      定时器,用于更新文本绘制。

    原理:

    • 利用QBasicTimer进行定时刷新。

    • 文本绘制时,使用QColor来设置色调(H)、饱和度(S)、亮度(V),然后计算每一个字符的绘制坐标,进行单个绘制。

    实现

    效果

    这里写图片描述

    源码

    头文件BannerWidget.h

    #ifndef PARA_BANNER_H
    #define PARA_BANNER_H
    
    #include <QWidget>
    #include <QBasicTimer>
    
    class BannerWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit BannerWidget(QWidget *parent = 0);
        ~BannerWidget();
    
    public slots:
        void setText(const QString &text);
    
    protected:
        // 绘制文本
        void paintEvent(QPaintEvent *event);
        // 定时刷新
        void timerEvent(QTimerEvent *event);
    
    private:
        QBasicTimer m_timer;
        QString m_strText;
        int m_nStep;
    };
    
    #endif

    源文件BannerWidget.cpp

    #include <QPainter>
    #include <QTimerEvent>
    #include <QFont>
    #include "BannerWidget.h"
    
    BannerWidget::BannerWidget(QWidget *parent)
        : QWidget(parent),
          m_nStep(0),
          m_strText(QString::fromLocal8Bit("一去丶二三里"))
    {
        setAutoFillBackground(true);
    
        // 设置文字大小
        QFont newFont = font();
        newFont.setPointSize(newFont.pointSize() + 20);
        setFont(newFont);
    
        m_timer.start(100, this);
    }
    
    BannerWidget::~BannerWidget()
    {
        m_timer.stop();
    }
    
    void BannerWidget::setText(const QString &text)
    {
        m_strText = text;
    }
    
    void BannerWidget::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        // 计算文本绘制的起始坐标
        QFontMetrics metrics(font());
        int x = (width() - metrics.width(m_strText)) / 2;
        int y = (height() + metrics.ascent() - metrics.descent()) / 2;
    
        QColor color;
        QPainter painter(this);
        for (int i = 0; i < m_strText.size(); ++i)
        {
            // 设置色调(H)、饱和度(S)、亮度(V)
            int nIndex = (m_nStep + i) % 16;
            color.setHsv((15 - nIndex) * 16, 255, 191);
            painter.setPen(color);
    
            // 单个字符绘制
            painter.drawText(x, y, QString(m_strText[i]));
    
            // 计算下一个字符的x坐标起始点
            x += metrics.width(m_strText[i]);
        }
    }
    
    void BannerWidget::timerEvent(QTimerEvent *event)
    {
        Q_UNUSED(event);
    
        if (event->timerId() == m_timer.timerId())
        {
            ++m_nStep;
            update();
        }
        else
        {
            QWidget::timerEvent(event);
        }
    }

    当然,我们也可以修改起始坐标x、y的值,稍作改动之后,让文本有跳动效果,自己尝试吧!

  • 相关阅读:
    机器视觉-halcon学习笔记1
    c#桌面窗体软件【学习笔记】
    Csharp学习笔记 重载
    unity学习笔记——第一人称
    Csharp学习笔记_kita (第二天)namespace
    try ,catch ,finally执行流程
    开发之统一异常处理
    git开发日常使用总结
    mysql5.7绿色版配置以及找不到 mysql服务问题解决
    正则表达式,将数据库字段转换为驼峰式
  • 原文地址:https://www.cnblogs.com/new0801/p/6146572.html
Copyright © 2011-2022 走看看