Qt之绘制闪烁文本

简介: 简述根据之前的二位绘图,我们可以很轻松的进行文本的绘制,如果需要一些特效,比如:文本闪烁。我们就必须借助其它辅助类来完成。简述原理实现效果源码原理主要涉及两个辅助类:QFontMetrics 用于获取文本字体的像素高度与宽度QBasicTimer 定时器,用于更新文本绘制。原理:利用QBasicTimer

简述

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

原理

主要涉及两个辅助类:

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

目录
相关文章
|
数据安全/隐私保护 Windows
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
908 0
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
|
自然语言处理 数据可视化
Qt开发技术:Qt富文本(二)Qt文本光标操作、文档布局、富文本编辑、处理和Demo
Qt开发技术:Qt富文本(二)Qt文本光标操作、文档布局、富文本编辑、处理和Demo
Qt开发技术:Qt富文本(二)Qt文本光标操作、文档布局、富文本编辑、处理和Demo
|
7月前
Qt窗口的闪烁QWebEngineView
Qt窗口的闪烁QWebEngineView
|
存储 UED
Qt自定义控件之动画文本
Qt自定义控件之动画文本
138 0
|
8月前
Qt 按行追加文本代码
Qt 按行追加文本代码
84 0
|
8月前
|
C++
[Qt5&控件] Label控件显示文本内容(字符串和整数)
[Qt5&控件] Label控件显示文本内容(字符串和整数)
167 0
[Qt5&控件] Label控件显示文本内容(字符串和整数)
|
8月前
QT基础教程(文本绘制)
QT基础教程(文本绘制)
165 0
|
移动开发 Linux Windows
linux系统中QT进行文本读写操作的方法
linux系统中QT进行文本读写操作的方法
204 0
|
C++
【Qt】实现文本整词高亮
QTextEdit 中显示富文本,整词匹配并高亮
205 0
|
数据安全/隐私保护
Qt之标签和单行文本编辑框(QLabel、QLineEdit)
Qt之标签和单行文本编辑框(QLabel、QLineEdit)
259 0