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的值,稍作改动之后,让文本有跳动效果,自己尝试吧!
Qt之绘制闪烁文本的更多相关文章
- Qt如何绘制(简单深刻,fearlazy的系列文章)
我觉得绘制只需要考虑几个问题.简单地说就是谁在什么地方画什么? 在Qt中可以这么回答:QPainter在QPainterDevice中画想画的东西. 举个例子:用QtCreator向导新建一个项目,基 ...
- QT界面绘制学习记录
1. MVC结构中,model必须作为类的成员变量存在,不可再函数内部申明.否则,会出现函数调用结束,model找不到的错误. 2.QcomboBox可设置为左边空白,右侧一小箭头的形式.代码:com ...
- 使用Qt开发绘制多个设备的流量曲线图(附带项目图)
一.说明: 在实际项目中,主要是使用Qt开发CS程序,当然主要是客户端.公司项目中有这个需求是实时显示多个设备的流量曲线图,设备将流量信息发给服务端,服务端再将信息通过Socket发给Qt客户端,Qt ...
- 解决C# WinForm Graphics绘制闪烁问题
不直接使用form的CreateGraphics创建Graphics进行绘制,可以先在Form上面放一个需要大小的PictureBox,再创建一个同大小的Bitmap,将这个Bitmap设置为Pict ...
- QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等)
本文使用QGLWidget来绘制各种三维基本图形,包括立方体.圆柱体.圆锥.球体.圆环等等,涉及包括基本绘制以及上色.纹理.旋转等操作. 使用的软件版本:QT5.12 + QT Creater4.8. ...
- 初识Qt文字绘制
1.新建一个Qt Gui应用,项目名称为myDraw,基类选择为QMainWindow,类名设置为MainWindow. 2.在mainwindow.h头文件中添加void paintEvent(QP ...
- QT时钟绘制
Demo的效果 资源占用还能接受 运行久一点内存就下去了 下面是Demo的代码 #include "mainwindow.h" #include "ui_mainwind ...
- 采用Qt快速绘制多条曲线(折线),跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)
QCustomPlot是一个开源的基于Qt的第三方绘图库,能够绘制漂亮的2D图形. QCustomPlot的官方网址:https://www.qcustomplot.com/ 从官网下载QCustom ...
- Qt paintEvent绘制窗体 注意Qt::WA_PaintOutsidePaintEvent 只是适用于X11,其他系统均无效
QPainter默认只能在paintEvent里面调用,但是: 在其他事件中绘制窗体,提示信息如下:QPainter::begin: Paint device returned engine == 0 ...
随机推荐
- SQL Server建表和增删改
create database 数据库名 go --穿件完成 go create table 表名(列名 类型, 列名 类型, 列名 类型 --最后一个列名不加逗号) go --创建完成go 以创建表 ...
- BZOJ 2666: [cqoi2012]组装
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2666 题意:n种零件,m个位置,每个位置有一种零件.求一个位置x,使得cost(1 ...
- acdream1197 Points In Cuboid(hash树状数组)
题目链接:http://acdream.info/problem?pid=1197 题意:给出三维空间n个点,m个查询,每次查询某个立方体内的点的个数. 思路:按照一维排序,根据查询插入,其他两位用二 ...
- C语言实现数组快速排序(含对算法的详细解释)
/* 说明: 代码参考过网上代码,但分析为个人原创,本贴重在说明快速排序算法的思想和运行过程. */ 代码部分: #include<stdio.h> #include<stdlib. ...
- TeeChart曲线平滑 Line.Smoothed
需要注意的是,在加载点之前,需要设置Smoothed属性为false 等点加载完成之后,再设置Smoothed属性为true, //如果直接设置Smoothed为true再去加载点的话,曲线就完全不显 ...
- Hibernate+Struts2+jsp 修改用户信息
在用户列表页面点击修改,进入修改页面 修改薪酬为555,点击提交,重新跳回该页面 修改成功 关键代码如下 基层的代码,这里增加了一个根据用户id查询的方法 dao层 //修改 public USer ...
- MySQL记录操作
说明:value的值可以为数据,DEFAULT,NULL,expr 含有ATUO_INCREMENT的列可以插入DEFAULT.NULL,或者不插入记录来实现自动增长. 插入记录的三种方法:①可以同时 ...
- Sql 行转列问题总结
行转列问题总结 1.行转列 ---1.最简单的行转列/* 问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物 ...
- Codeforces Round #197 (Div. 2)
A.Helpful Maths 分析:将读入的字符转化为数字,直接排个序就可以了. #include <cstdlib> #include <cstring> #include ...
- 2013 Multi-University Training Contest 3
HDU-4622 Reincarnation 题意:给定一个字符串,有Q次询问,每次询问得出区间[L, R]内有多少个不同的子串. 分析:后缀数组搞,不过hash+dp也能够搞定这题,详解见http: ...