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

发布时间:2024-08-11 13:01

目录
  • 一、项目介绍
  • 二、项目基本配置
  • 三、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_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 
     

    重写绘制事件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;iisActive())
        {
            if(m_ms)
            {
                timer->start(m_ms);//启动计时,以m_ms为间隔
            }
        }
    
    }
    

    五、效果演示

    完整效果如下:

    \"Qt实现字幕滚动效果的示例代码_第1张图片\"

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

    ItVuer - 免责声明 - 关于我们 - 联系我们

    本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

    桂ICP备16001015号