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. kafka学习(三)kafka生产者,消费者详解

    文章更新时间:2020/06/14 一.生产者 当我们发送消息之前,先问几个问题:每条消息都是很关键且不能容忍丢失么?偶尔重复消息可以么?我们关注的是消息延迟还是写入消息的吞吐量? 举个例子,有一个信 ...

  2. Pycharm默认输入状态是insert状态,选中文字无法直接输入替换或删除

    最近在学习Python,使用pycharm的时候,我的光标处于加粗状态,也就是编程软件经常出现的insert插入编辑模式,我就点击了一下insert按键,退出了这个模式,但是我每次打开都是会处于这种模 ...

  3. WPF DataGrid 复合表头 (实现表头合并,自定义表头)

    功能说明: 将 DataGrid嵌套在本控件内,使用Label自定义表头,如果需要上下左右滚动 需要在控件外围添加  ScrollViewer 并且设置  ScrollVisibility 为Auto ...

  4. Python-全局函数(内置方法、内置函数)

    Python有很多内置方法,这些都全局可用 abs() 求数值的绝对值,如果是复数则返回其模 print(abs(-17), abs(30.2), abs(3+4j)) # Python中复数表示为 ...

  5. 服务器备用远程-----Radmin客户端的操作指南(如何远程与传送文件)

    一台服务器的寿命一般比较长可能会从几年到几十年,就会经历各个版本的更新与升级.再经过时间的历练后,可能windwos自带的远程连接有时候会拉胯,经常报错. 这时候就需要备选方案,有钱的单位会自己搭建堡 ...

  6. 067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数

    067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数 本文知识点:数组作为方法参数 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  7. 学习Jmeter,这一篇就够了

    Jmeter在软件测试中的常用功能,看完你应该就会了 1.Jmeter的下载安装 1.1  Jmeter的官方网址是:http://jmeter.apache.org/:下载最新的包到本地进行解压,路 ...

  8. JMeter实战(一) 体系结构

    此为开篇,介绍JMeter的组成结构,阅读后对JMeter形成整体认知和初步印象. 为了便于后续讲解,先明确下2个术语. 元件:如HTTP请求.事务控制器.响应断言,就是一个元件. 组件:如逻辑控制器 ...

  9. MonkeyRunner+Python自动化测试一

    MonkeyRunner介绍 1.monkeyrunner 工具提供了一个 API,用于编写可从 Android 代码外部控制 Android 设备或模拟器的程序.使用 monkeyrunner,您可 ...

  10. Fiddler抓包工具 请求图标为一个锁的图标的设置

    第一步,Fiddler抓包的数据 前面的都是一个锁的图标,的设置方法, 然后 点击打开 按此设置图一 在图二, 图三. 其他默认就好