• 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的值,稍作改动之后,让文本有跳动效果,自己尝试吧!

  • 相关阅读:
    week4:周测错题
    小程序1:登录/注册小程序
    小程序2:实现一个购物车
    day26:装饰器&面向对象当中的方法&property
    day25:7个魔术方法&5个关于类的魔术属性
    day24:多态&魔术方法__new__&单态模式
    day23:单继承&多继承&菱形继承&__init__魔术方法
    day22:面向对象封装对象操作&类操作&面向对象删除操作
    day21:正则函数&模块和包(import)
    APP探索之iAPP
  • 原文地址:https://www.cnblogs.com/new0801/p/6146572.html
Copyright © 2020-2023  润新知