Qt实现字幕滚动效果的示例代码

目录
  • 一、项目介绍
  • 二、项目基本配置
  • 三、UI界面设计
  • 四、主程序实现
    • 4.1 widget.h头文件
    • 4.2 widget.cpp源文件
  • 五、效果演示

一、项目介绍

利用QTimer实现字幕滚动功能,可以实现自行更改文本内容、自适应文本大小、自由调整速度等功能。

二、项目基本配置

新建一个Qt案例,项目名称为“TextScroll”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。

三、UI界面设计

无UI界面

四、主程序实现

4.1 widget.h头文件

声明私有变量和事件:

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:
    void setDelay(int ms,int pixelSize);  //设置滚动延迟,多少ms滚动多少像素点

    void setText(QString text,QRgb textColor,float speed=0.70,int blankSuffix=20); //设置字体,调用该函数后,将会自动启动定时器来滚动字幕
    //void restart();

public slots:
    void timeOut();

4.2 widget.cpp源文件

主函数内容如下:

    resize(600,100);//调整窗口大小
    timer = new QTimer(this);//创建定时器
    connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));

    QString text="人生百相,世态万千,悲悲喜喜,才构成了人生的完美;谋事在人,成事在天。"
        "做过的事不要后悔。经常可以看到不少人自怨自艾,"
        "为曾经做过的错事后悔不已,为过去的事而消沉,为过去的事而落魄。世上永远没有后悔药。";
    QRgb textColor=qRgb(67,142,219);//字体颜色——蓝色
    float speed=0.4;
    int blankSuffix=0;
    setText(text,textColor,speed,blankSuffix);

timeOut()槽函数:

//槽函数
void Widget::timeOut(){
    qDebug()<<m_moveOffset<<m_moveSize;
    m_moveOffset+=m_pixelSize;

    if(m_moveOffset>m_moveSize)
    {
        m_moveOffset= 0;
    }
    update();
}

调整窗口大小resizeEvent事件:

void Widget::resizeEvent(QResizeEvent *event)
{
    font.setPixelSize(event->size().height()*0.75);//字体大小(这里设置为窗口高度的0.75倍)

    m_showText = m_text;
    QFontMetrics metrics(font);
    int char_w = metrics.horizontalAdvance(" ");//Qt5.11之后,之前请用width()
    setDelay(30,char_w*speed);//滚动延时
    int blankLine =width()/char_w+1;

    for(int i=0;i<blankLine;i++)
    {
        m_showText.insert(0," ");//开头插入blankLine个空格
    }
    m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix;
    m_moveOffset=0;

    update();
}

重写绘制事件paintEvent:

//绘图事件
void Widget::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);//绘制文字,水平居左垂直居中
}

定义滚动延迟函数:

//设置滚动延迟,多少ms滚动多少像素点pixelSize
void Widget::setDelay(int ms,int pixelSize)
{

    this->m_ms=ms;
    this->m_pixelSize=pixelSize;
}

设置字体相关信息:

//设置字体相关信息(text:字体内容,textColor:颜色,speed:字体滚动速度,blankSuffix:留白大小)
void Widget::setText(QString text, QRgb textColor, float speed, int blankSuffix)
{
    this->blankSuffix = blankSuffix;
    this->speed = speed;

    font.setFamily("Microsoft Yahei");//字体样式——微软雅黑
    font.setPixelSize(height()*0.0001); //字体像素大小

    this->textColor = textColor;    //字体颜色

    m_text = text;                  //文本内容
    m_showText = m_text;            //显示内容

    //计算字符大小
    QFontMetrics metrics(font);
    int char_w = metrics.horizontalAdvance(" ");//Qt5.11之后,之前请用width()
    setDelay(50,char_w*speed);//调用setDelay()函数,设置滚动延时

    int blankLine =width()/char_w+2;//

    for(int i=0;i<blankLine;i++)
    {
        m_showText.insert(0," ");//开头插入blankLine个空格
    }

    m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix;

    m_moveOffset=0;
    //如果计时器没有运行
    if(!timer->isActive())
    {
        if(m_ms)
        {
            timer->start(m_ms);//启动计时,以m_ms为间隔
        }
    }

}

五、效果演示

完整效果如下:

以上就是Qt实现字幕滚动效果的示例代码的详细内容,更多关于Qt字幕滚动的资料请关注我们其它相关文章!

(0)

相关推荐

  • QTimer与QTime实现电子时钟

    本文实例为大家分享了QTimer与QTime实现电子时钟的具体代码,供大家参考,具体内容如下 使用QLCDNumber控件进行显示 QLCDNumber控件默认只显示5个字符,可以使用setDigitCount(int size)进行设置显示个数 使用Display(QString str) 设置显示内容 该函数拥有多个重载,字符 整型 浮点型都可以作为参数 效果图: 代码:头文件 #include <QLCDNumber> class NumClock : public QLCDNumber

  • Qt使用QPainter实现自定义圆形进度条

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 roundprogressbar.h和roundprogressbar.cpp 4.2 widget.h头文件 4.3 widget.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用QPainter实现自定义圆形进度条. 二.项目基本配置 新建一个Qt案例,项目名称为“RoundprogressbarTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建. 三.UI界面设置 UI界面如

  • Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    Qt多线程 我们之前的程序都是单线程运行,接下来我们开始引入多线程.就相当于以前的一个人在工作,现在多个人一起工作. Qt中非常有必要使用多线程,这是因为,Qt应用是事件驱动型的,一旦某个事件处理函数处理时间过久,就会造成其它的事件得不到及时处理. Qt中使用QThread来管理线程,一个QThread对象,就是一个线程.QThread对象也有消息循序exec()函数,用来处理自己这个线程的事件. Qt实现多线程有两种方式 ​1.Qt第一种创建线程方式 首先要继承QThread 重写虚函数QTh

  • Qt实现简易计时器的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 计时器实现四个功能:开始计时.停止计时.暂停计时以及打点.当点击暂停时,开始按钮和停止按钮无法点击,此时暂停按钮变为继续.当点击停止时,开始按钮和暂停按钮无法点击,此时停止按钮变为清零. 二.项目基本配置 新建一个Mainwindow界面.基本配置与其他Qt项目类似,这里不过多介绍. 三.UI界面设计 UI界面如下

  • QT利用QPainter绘制三维饼状图

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用QPainter实现三维饼状图的绘制,由于Qt中没有三维饼状图的绘制组件,因此只能自行绘制. 二.项目基本配置 新建一个Qt案例,项目名称为“PieTest”,基类选择“QWidget”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.1 widget.h头文件 头文件中只

  • 详解Qt使用QImage类实现图像基本操作

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 利用QImage类实现对图像的基本操作,包括图像显示.图像缩放.图像旋转等. 二.项目基本配置 新建一个Qt案例,项目名称为“ImageTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建. 三.UI界面设计 UI界面布局如下: 界面中创建了5个控件,其名称和类型如下: 序号 名称 类型 属性 ① Ch

  • Qt实现字幕滚动效果的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 利用QTimer实现字幕滚动功能,可以实现自行更改文本内容.自适应文本大小.自由调整速度等功能. 二.项目基本配置 新建一个Qt案例,项目名称为“TextScroll”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建. 三.UI界面设计 无UI界面 四.主程序实现 4.1 widget.h头文件 声明私

  • vue实现公告栏文字上下滚动效果的示例代码

    本文详细的介绍了vue实现公告栏文字上下滚动效果的示例代码,分享给大家,具体入如下: 代码实现: 在项目结构的components中新建text-scroll.vue文件 <template> <div class="text-container"> <transition class="" name="slide" mode="out-in"> <p class="text

  • Qt实现简易毛玻璃效果的示例代码

    目录 现有功能 运行结果 源码 frosted_glass_label.h frosted_glass_label.cpp main.cpp 现有功能 1.用模糊功能实现简易的毛玻璃效果. 2.鼠标移动无边框窗口. 运行结果 源码 frosted_glass_label.h #ifndef FROSTEDGLASSLABEL_H #define FROSTEDGLASSLABEL_H #include <QWidget> #include <QLabel> #include <

  • vue实现消息的无缝滚动效果的示例代码

    朋友的项目里要实现一个消息无缝滚动的效果,中途遇到了一点小bug,每组消息滚动完再次循环时会出现停留两倍的时间间隔问题,我研究了一天终于解决了这个1S的小问题 项目环境vue-cli ,请自行配置好相应的,环境及路由,这里主要介绍实现的方法 第一步在模板中 使用v-for方法循环出消息列表 <template> <div id="box"> <ul id="con1" ref="con1" :class="

  • MFC实现字幕滚动效果

    本文实例为大家分享了MFC实现字幕滚动效果的具体代码,供大家参考,具体内容如下 1.创建对话框工程 这一步很简单,可以参考我之前的博客.这里可以先放出我程序运行的效果图.如果不是你所需要的可以直接关闭博客了. 2.添加控件 在界面上面主要用到的就是CStatic, Cedit,Cbutton这里给我我对话框的资源图: 3.添加消息 需要添加定时消息,背景颜色消息,添加消息: ON_WM_CTLCOLOR() ON_WM_TIMER() HBRUSH CDemoLEDDlg::OnCtlColor

  • Qt自绘实现苹果按钮滑动效果的示例代码

    用到的类:QTimer,QPaintEvent,QPainter,QRectF 首先,重写绘制事件,需要在头文件加入QPaintEvent头文件,并定义几个变量. bool ison=false; float currentValue; float widthSize,heightSize; 然后加入如下代码: 思路就是鼠标点击,触发paintEvent函数 void MainWindow::mousePressEvent(QMouseEvent *event){ Q_UNUSED(event)

  • Unity实现老虎机滚动抽奖效果的示例代码

    直接看下效果图吧: 制作思路: 设计四张图片,五个点,每个图片同时向下一个点移动,到最后一个就回到0号点,以此循环. 场景搭建: 创建Image命名为Bg作为电视框背景: 创建Image命名Mask并添加Mask组件作为电视框内容显示遮罩框: 创建四个Image作为滚动图片: 创建开始抽奖按钮: PS:实际项目中可以根据需求来动态修改图片显示,以达到的控制每次抽奖奖品内容. 源码分享: using System.Collections; using UnityEngine; using Unit

  • Docker Swarm实现服务的滚动更新的示例代码

    一.什么是Docker Swarm? Docker Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些. Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创

  • 使用原生JS实现滚轮翻页效果的示例代码

    一.滚轮事件 当用户通过鼠标滚轮与页面交互.在垂直方向上滚动页面时,就会触发mousewheel事件,这个事件就是实现全屏切换效果需要用到的.在IE6, IE7, IE8, Opera 10+, Safari 5+中,都提供了 "mousewheel" 事件,而 Firefox 3.5+ 中提供了一个等同的事件:"DOMMouseScroll".与mousewheel事件对应的event对象中我们还会用到另一个特殊属性-wheelDelta属性. 1."m

  • Android 滚动时间选择的示例代码

    效果图 复制代码直接用!!!! 1.导入依赖 implementation 'com.bigkoo:pickerview:2.1.0' 2.三个bean类 PickerViewData public class PickerViewData implements IPickerViewData { private String content; public PickerViewData(String content) { this.content = content; } public voi

随机推荐