您的位置:首页 > 编程语言 > Qt开发

Qt实现滚动字幕

2017-06-04 09:43 357 查看
        转自http://blog.csdn.net/u011417605/article/details/51211853

滚动字幕,也叫跑马,就是动态显示一行字符。前面实现是使用QTimer控制,直接在槽函数中截取字符串进行显示,只控制字符串在控件的一端显示,超出控件的部分并没有从控件的另一端循环显示出来。于是我重新实现了一种方法,或者说完善了前面的不足吧。

使用QTimer控制显示的节奏,在paintEvent中进行截取显示。从左端被截掉的部分会从右端显示出来。

难点在于,我们需要依据控件的宽度,控制字符串的显示位置。所以我们还需要知道每个字符的宽度。QWidget提供了方法可以计算字符的宽度,QFontMetrics类可以计算字符或者字符串的宽度,注意是宽度,而不是长度。

实现效果:



计算一个字符所占的宽度:

[cpp] view
plain copy

fontMetrics().width("a");//每个字符的宽度  

完整示例代码:

[cpp] view
plain copy

#ifndef TEXTTICKER_H  

#define TEXTTICKER_H  

  

  

#include <QtWidgets/QLabel>  

  

  

class TextTicker : public QLabel  

{  

    Q_OBJECT  

  

  

public:  

    TextTicker(QWidget *parent = 0);  

    ~TextTicker();  

  

  

protected:  

    void paintEvent(QPaintEvent *event);  

    void updateIndex();  

  

  

private:  

    int m_charWidth;  

    int m_curIndex;  

    QString m_showText;  

};  

  

  

#endif // TEXTTICKER_H  

[cpp] view
plain copy

#include "textticker.h"  

#include <QPainter>  

#include <QTimer>  

  

  

TextTicker::TextTicker(QWidget *parent)  

    : QLabel(parent)  

{  

    setMinimumWidth(200);  

    setMinimumHeight(40);  

  

  

    m_curIndex = 0;//当前角码  

    m_showText = "This is a textTicker Text!";//显示的文字  

    m_charWidth = fontMetrics().width("a");//每个字符的宽度  

  

  

    QTimer *timer = new QTimer(this);  

    connect(timer, &QTimer::timeout, this, &TextTicker::updateIndex);  

    timer->start(100);  

}  

  

  

TextTicker::~TextTicker()  

{  

  

  

}  

  

  

void TextTicker::paintEvent(QPaintEvent *event)  

{  

    __super::paintEvent(event);  

    QPainter painter(this);  

    painter.drawText(0, 30, m_showText.mid(m_curIndex));  

    painter.drawText(width() - m_charWidth*m_curIndex, 30, m_showText.left(m_curIndex));  

}  

  

  

void TextTicker::updateIndex()  

{  

    update();  

    m_curIndex++;  

    if (m_curIndex*m_charWidth > width())  

        m_curIndex = 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: