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. JMeter5.0在windows(含插件安装)

    一.jmeter下载 前提:已经安装jdk8+ jmeter下载地址:http://jmeter.apache.org/download_jmeter.cgi 有Binaries和Source版本 前 ...

  2. 二分类问题 - 【老鱼学tensorflow2】

    什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...

  3. 面试官:讲讲Redis的五大数据类型?如何使用?(内含完整测试源码)

    写在前面 最近面试跳槽的小伙伴有点多,给我反馈的面试情况更是千差万别,不过很多小伙伴反馈说:面试中的大部分问题都能够在我的公众号[冰河技术]中找到答案,面试过程还是挺轻松的,最终也是轻松的拿到了Off ...

  4. PyCharm2018.3.5下载和安装及永久破解详解(成功案例)

    靓仔靓女,你是否在网上找了很多的方法都破解不了PyCharm,是有原因的!无论什么编程工具都不要下载近一到/两年内的版本,人家即把网上的一些破解方法修复了,而且还在测试阶段,不稳定就完事了我装的是20 ...

  5. Artwork (Gym - 102346A)【DFS、连通块】

    Artwork (Gym - 102346A) 题目链接 算法 DFS,连通块 时间复杂度:O(k*n + k * k) 1.这道题就是让你判断从(0,0)到(m,n),避开中途所有的传感器(传感器的 ...

  6. PPT画成这样,述职答辩还能过吗?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 标题有点凶,但内容很干! 大部分程序员并不会画PPT,也梳理不出架构图.工作的年头虽 ...

  7. npm包的发布和管理

    npm包管理 npm其实是Node.js的包管理工具(node package manager). 为啥我们需要一个包管理工具呢?因为我们在Node.js上开发时,会用到很多别人写的JavaScrip ...

  8. C#设计模式-适配器模式(Adapter Pattern)

    概念 把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作.适配器模式有类的适配器模式和对象的适配器模式两种形式.前者类之间的耦合度比后者高,且要求程 ...

  9. 大话Python函数底层逻辑

    函数 叫 子过程或子程序 描叙的更为贴近实际应用场景 这和数学中的函数实现上不同但语义上相识,如 f(x) = expressiom, 给定一个确定的输入必然返回一个确定的输出 数学中函数的关系是通过 ...

  10. shiro入门学习--授权(Authorization)|筑基初期

    写在前面 经过前面的学习,我们了解了shiro中的认证流程,并且学会了如何通过自定义Realm实现应用程序的用户认证.在这篇文章当中,我们将学习shiro中的授权流程. 授权概述 这里的授权指的是授予 ...