1.描述

最近要实现一个滚动条字幕,但是搜到的系列文章都是利用定时器QTimer,在固定的时间截取文本并显示,这样滚动的时候其实是断断续续的,因为实际上是一个个字符位移实现的,不过实现方便.

所以只有自己实现无间隙滚动条字幕.

2.界面展示

示例如下图所示:

效果图如下所示(支持自适应主界面大小,根据主界面窗口变换,自动更正文本大小,速度):

3.代码实现

头文件:

#ifndef TEXTSCROLL_H
#define TEXTSCROLL_H #include <QObject>
#include <QWidget>
#include <QTimer>
#include <QPainter>
#include <QFontMetrics>
#include <QResizeEvent>
class textScroll : public QWidget
{
Q_OBJECT private: QTimer* timer; //时间定时器
QRgb textColor;
QString m_text;
QString m_showText;
QFont font;
int m_ms;
int m_pixelSize;
int m_moveOffset;
int m_moveSize;
int blankSuffix;
float speed; //滑动速度,值越大越快 void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event); public: explicit textScroll(QWidget *parent = 0); //qRgb(int r, int g, int b) void setDelay(int ms,int pixelSize); //设置滚动延迟,多少ms滚动多少像素点 void setText(QString text,QRgb textColor,float speed=0.70,int blankSuffix=20); //设置字体,调用该函数后,将会自动启动定时器来滚动字幕
//blankSuffix:显示空白后缀长度,值越大,那么等待下一帧开头越久 void restart(); signals: public slots:
void timeOut(); }; #endif // TEXTSCROLL_H

源文件:

#include "textscroll.h"
#include <QDebug>
textScroll::textScroll( QWidget *parent) : QWidget(parent)
{ timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
} void textScroll::timeOut()
{
qDebug()<<m_moveOffset<<m_moveSize;
m_moveOffset+=m_pixelSize; if(m_moveOffset>m_moveSize)
{
m_moveOffset= 0;
} update();
} void textScroll::resizeEvent(QResizeEvent *event)
{ font.setPixelSize(event->size().height()*0.75); m_showText = m_text;
QFontMetrics metrics(font);
int char_w = metrics.width(" ");
setDelay(30,char_w*speed); int blankLine =width()/char_w+1; for(int i=0;i<blankLine;i++)
{
m_showText.insert(0," ");
}
m_moveSize=metrics.width(m_showText)+blankSuffix;
m_moveOffset=0; update();
} void textScroll::paintEvent(QPaintEvent *event)
{ QPainter painter(this);
painter.setFont(font); painter.setPen(QColor(120,120,120));
painter.drawRect(QRect(0,0,width()-1,height()-1)); //绘制边框,方便看出 painter.setPen(QColor(textColor)); painter.drawText(QRect(-m_moveOffset,0,width()-1+m_moveOffset,height()-1),
Qt::AlignVCenter|Qt::AlignLeft,m_showText); } void textScroll::setDelay(int ms,int pixelSize) //设置滚动延迟,多少ms滚动多少像素点
{ this->m_ms=ms;
this->m_pixelSize=pixelSize;
} void textScroll::setText(QString text, QRgb textColor, float speed, int blankSuffix) //设置字体,调用该函数后,将会自动启动定时器来滚动字幕
{
this->blankSuffix = blankSuffix;
this->speed = speed; font.setFamily("Microsoft Yahei");
font.setPixelSize(height()*0.75); this->textColor = textColor; m_text = text;
m_showText = m_text; QFontMetrics metrics(font);
int char_w = metrics.width(" ");
setDelay(50,char_w*speed); int blankLine =width()/char_w+2; for(int i=0;i<blankLine;i++)
{
m_showText.insert(0," ");
} m_moveSize=metrics.width(m_showText)+blankSuffix; m_moveOffset=0;
if(!timer->isActive())
{
if(m_ms)
{
timer->start(m_ms);
}
} } void textScroll::restart()
{
m_moveOffset=0; update(); }

56.Qt-滚动字幕之无间隙滚动(原创)的更多相关文章

  1. JS实现上下左右四方向无间隙滚动

    想必大家都注意到<marquee>的不循环滚动,所以出现了很多替代脚本,或iframe或JS输出< marquee>,不管怎么做,都略显麻烦.下面说一下这个相对简单的实现思路: ...

  2. js无间隙滚动

    代码一: ; //设置文字滚动速度 dome2.innerHTML=dome1.innerHTML //复制dome1为dome2 function Marquee(){ ) //当滚动至dome1与 ...

  3. Qt之滚动字幕

    简述 滚动字幕,也就是传说中的跑马灯效果. ​简单地理解就是:每隔一段时间(一般几百毫秒效果较佳)显示的文字进行变化(即滚动效果). 简述 实现 效果 源码 实现 利用定时器QTimer,在固定的时间 ...

  4. 如何在pyqt中实现丝滑滚动字幕

    滚动字幕的视觉效果 网上有很多博客介绍了滚动字幕的实现方法,懂得都懂,大部是 Ctrl C + Ctrl V,效果还很差,最后还是得靠自己.主要思路就是通过定时器定时刷新+绘制两段完整的字符串来达到 ...

  5. HTML滚动字幕代码参数详解及Js间隔滚动代码

    html文字滚动代码 <marquee style="WIDTH: 388px; HEIGHT: 200px" scrollamount="2" dire ...

  6. UILabel滚动字幕的实现

    经常需要在应用中显示一段很长的文字,比如天气或者广告等,这时候使用滚动字幕的方式比较方便. 参考文献: [1] YouXianMing, 使用UILabel实现滚动字幕移动效果, 博客园 [2] ht ...

  7. javascript-图片横向无缝隙滚动(可在服务器运行)

    前两次弄'图片横向滚动'javascript,在本地上运行得很美,可是一上到我们学校后台的服务器,就有很多问题,这个算是行的了. css代码: <style type="text/cs ...

  8. JavaScript js无间断滚动效果 scrollLeft方法 使用模板

    JavaScript js无间断滚动效果 scrollLeft方法 使用模板 <!DOCTYPE HTML><html><head><meta charset ...

  9. js原生 + jQuery实现页面滚动字幕

    js原生/jQuery实现页面滚动字幕效果 17:45:49 在新闻列表或者文章列表信息等页面中很容易要求实现字幕滚动的效果,以下为简单的实现页面中滚动字幕的效果 1.jQuery实现页面滚动字幕效果 ...

随机推荐

  1. 云计算openstack核心组件——keystone身份认证服务(5)

    一.Keystone介绍:       keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户 ...

  2. TCP报文结构和长短连接

    参考博文: https://www.cnblogs.com/onlysun/p/4520553.html https://blog.csdn.net/zxy987872674/article/deta ...

  3. uniapp vue v-html,显示富文本,内容img图片超出解决办法

    uniapp h5中,v-html,img图片中style=width:auto;会显示图片原来的尺寸,会超出屏幕,替换成width:100%,这样就不会超出屏幕 重要的地方,例如<img sr ...

  4. 【JAVA】校招面过的信息量最大的一面

    这是我校招中面过的信息量最大的一面,本来是一个小时,最后面完一个半小时,面试官最后反馈还不错. 自我介绍 设计模式有了解吗?如何理解"宁用组合,不用继承",什么时候用组合,什么时候 ...

  5. 《Netty权威指南》笔记

    第1章 Java的I/O演进之路 1.1 Linux网络I/O模型 fd:file descriptor,文件描述符.linux内核将所有外部设备都看作一个文件来操作,对文件的读写会调用内核提供的命令 ...

  6. 《Java并发编程的艺术》笔记

    第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种:无锁并发编程.CAS算法.使用最少线程.使 ...

  7. Python-禅

    Python特点 1. 面向对象解释性编程语言 2. 简洁.优雅的编码风格 3. 跨平台 windows MacOS Linux 4. 丰富的标准库和第三方库 什么是编程? 解决现实中问题 什么是面向 ...

  8. 从面向过程到面向对象再到MVC

    /* * * title: 从面向过程到面向对象再到MVC * author: tanghao * date: 2020.9.30 * version: 1.0 * */ 前言 本文档通过一个显示20 ...

  9. SQL错题集

    查找最晚入职员工的所有信息 select * from employees where hire_date = (select max(hire_date) from employees) 查找入职员 ...

  10. centos配置WordPress(Apache+mysql+php)

    .安装Apache 安装命令:sudo yum install httpd 启动服务:sudo service httpd start 在浏览器输入IP地址,正常应该显示Apache的欢迎页面 如果提 ...