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

 更新时间:2022年06月17日 09:42:08   作者:wendy_ya  
这篇文章主要介绍了Qt如何利用QTimer实现字幕滚动功能,并且可以实现自行更改文本内容、自适应文本大小、自由调整速度等功能,感兴趣的可以学习一下

一、项目介绍

利用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字幕滚动的资料请关注脚本之家其它相关文章!

相关文章

  • C++中如何修改const变量你知道吗

    C++中如何修改const变量你知道吗

    这篇文章主要为大家详细介绍了C++修改const变量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言-I/O流设计实验

    C语言-I/O流设计实验

    编程语言的I/O类库中常常使用流这个抽象的概念,它代表任何有能力产生数据的数据源对象或时有能力接收数据的接收端对象,本文为大家介绍C语言中I/O系统基础知识
    2021-07-07
  • Visual Studio 2022编译C++20代码

    Visual Studio 2022编译C++20代码

    本文主要介绍了Visual Studio 2022编译C++20代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++ OpenCV生成蒙太奇图像的示例详解

    C++ OpenCV生成蒙太奇图像的示例详解

    图片的蒙太奇效果,一般称为马赛克图。由很多小图拼接成一个大图。这篇文章主要为大家介绍如何利用C++ OpenCV实现生成蒙太奇图像,感兴趣的可以了解一下
    2022-01-01
  • 关闭显示器软件代码分享

    关闭显示器软件代码分享

    这篇文章主要介绍了使用程序如何关闭显示器的代码,需要的朋友可以参考下
    2014-01-01
  • 详解C语言的mem系列函数

    详解C语言的mem系列函数

    这篇文章主要为大家详细介绍了C语言的mem系列函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • c++ 动态内存分配相关总结

    c++ 动态内存分配相关总结

    这篇文章主要介绍了c++ 动态内存分配相关的相关资料,帮助大家更好的理解和学习和使用c++,感兴趣的朋友可以了解下
    2021-02-02
  • C++实现下载的代码

    C++实现下载的代码

    这篇文章主要介绍了C++实现下载的代码,以下载百度图片为例较为完整的讲述了C++下载的具体实现方法,需要的朋友可以参考下
    2014-10-10
  • C语言动态内存管理分析总结

    C语言动态内存管理分析总结

    C语言中开辟内存有很多种方式,目前我们最常用的也就是数组,但数组是在我们用到他之前就得设定好它的长度,有时很不方便。随意我们来探究动态内存管理
    2021-11-11
  • 用C语言程序判断大小端模式

    用C语言程序判断大小端模式

    本文介绍了用C语言程序判断大小端的方法,与大家分享一下。
    2013-04-04

最新评论