• 56.Qt-滚动字幕之无间隙滚动


    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); //设置字体,调用该函数后,将会自动启动定时器来滚动字幕
                                                      
    
    
        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();
    
    }

     项目下载地址:https://download.csdn.net/download/qq_37997682/13029683

  • 相关阅读:
    【3.1】学习C++之再逢const
    【8】学习C++之this指针
    【7】学习C++之类的构造函数
    【6】学习C++之类的实例化及访问
    【5】学习C++之类的概念
    【4】学习C++之内存管理
    【3】学习C++之const关键字的使用
    【2】学习C++之引用
    【C#第一天】数据相关
    【1】学习C++时,一些零散知识点01
  • 原文地址:https://www.cnblogs.com/lifexy/p/13867016.html
Copyright © 2020-2023  润新知