简述

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

原理

主要涉及两个辅助类:

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

Qt之绘制闪烁文本的更多相关文章

  1. Qt如何绘制(简单深刻,fearlazy的系列文章)

    我觉得绘制只需要考虑几个问题.简单地说就是谁在什么地方画什么? 在Qt中可以这么回答:QPainter在QPainterDevice中画想画的东西. 举个例子:用QtCreator向导新建一个项目,基 ...

  2. QT界面绘制学习记录

    1. MVC结构中,model必须作为类的成员变量存在,不可再函数内部申明.否则,会出现函数调用结束,model找不到的错误. 2.QcomboBox可设置为左边空白,右侧一小箭头的形式.代码:com ...

  3. 使用Qt开发绘制多个设备的流量曲线图(附带项目图)

    一.说明: 在实际项目中,主要是使用Qt开发CS程序,当然主要是客户端.公司项目中有这个需求是实时显示多个设备的流量曲线图,设备将流量信息发给服务端,服务端再将信息通过Socket发给Qt客户端,Qt ...

  4. 解决C# WinForm Graphics绘制闪烁问题

    不直接使用form的CreateGraphics创建Graphics进行绘制,可以先在Form上面放一个需要大小的PictureBox,再创建一个同大小的Bitmap,将这个Bitmap设置为Pict ...

  5. QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等)

    本文使用QGLWidget来绘制各种三维基本图形,包括立方体.圆柱体.圆锥.球体.圆环等等,涉及包括基本绘制以及上色.纹理.旋转等操作. 使用的软件版本:QT5.12 + QT Creater4.8. ...

  6. 初识Qt文字绘制

    1.新建一个Qt Gui应用,项目名称为myDraw,基类选择为QMainWindow,类名设置为MainWindow. 2.在mainwindow.h头文件中添加void paintEvent(QP ...

  7. QT时钟绘制

    Demo的效果 资源占用还能接受 运行久一点内存就下去了 下面是Demo的代码 #include "mainwindow.h" #include "ui_mainwind ...

  8. 采用Qt快速绘制多条曲线(折线),跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)

    QCustomPlot是一个开源的基于Qt的第三方绘图库,能够绘制漂亮的2D图形. QCustomPlot的官方网址:https://www.qcustomplot.com/ 从官网下载QCustom ...

  9. Qt paintEvent绘制窗体 注意Qt::WA_PaintOutsidePaintEvent 只是适用于X11,其他系统均无效

    QPainter默认只能在paintEvent里面调用,但是: 在其他事件中绘制窗体,提示信息如下:QPainter::begin: Paint device returned engine == 0 ...

随机推荐

  1. 我的android学习经历26

    ViewPager的使用 ViewPager就想微信或者qq的顶部的导航栏一样,滑动可以改变到不同的View或者Fragment 使用方法: 在布局文件中定义标签: android.support.v ...

  2. HDU 4442 Physical Examination

    Physical Examination Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  3. Hibernate——基础及XML配置

    1.入门 hibernate是跟数据库打交道的,一般跟数据库打交道的都不简单 原始.底层直接的一些操作.编码量比较大.费时.用框架高效 把原来一点一点实现的东西,现在给个半成品,不用在这上边发时间,把 ...

  4. 09.VMWare虚拟机copy后网卡不是eth0解决办法

    0.如果VM虚拟机已经复制了,网卡已经不是eth0了,看下面1--->步骤,如果还没复制将要复制,只看1就行     点击I copy it.这时虚拟机会在开机时检查是否次网卡无力地址已经存在, ...

  5. CUBRID学习笔记 28 执行sql脚本文件

    一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...

  6. 《NoSQL精粹》思维导图读书笔记

    <NoSQL精粹>思维导图读书笔记 各主题笔记 这本书短小精悍,虽不能解答所有NoSQL疑问,但在读书过程中会抛给你不少未曾想过的问题,给人以更深入的思考: 这里对每一个主题分别做了笔记: ...

  7. 学习Berkeley DB- 入门

    1 导言 首先,我们要了解Berkeley DB的一些基本特性,在IBM的开发网站上有篇文章对其有比较清晰的介绍: 这篇文章讲到了BDB的设计思想和核心数据结构.以及数据访问算法:并有常用函数使用范例 ...

  8. 没有Path的Binding

    当Binding源本身就是数据且不需要Path来指明时,可以设置Path的值为".",或直接省略Path.XAML中这个"."可以省略不写,但在C#代码中是不能 ...

  9. Java抓取网页数据(原网页+Javascript返回数据)

    有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同! 本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数 ...

  10. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...