Qt实现滚动字幕

        转自http://blog.csdn.net/u011417605/article/details/51211853

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

使用QTimer控制显示的节奏,在paintEvent中进行截取显示。从左端被截掉的部分会从右端显示出来。
难点在于,我们需要依据控件的宽度,控制字符串的显示位置。所以我们还需要知道每个字符的宽度。QWidget提供了方法可以计算字符的宽度,QFontMetrics类可以计算字符或者字符串的宽度,注意是宽度,而不是长度。
实现效果:



计算一个字符所占的宽度:
[cpp]  view plain  copy
  1. fontMetrics().width("a");//每个字符的宽度  
完整示例代码:
[cpp]  view plain  copy
  1. #ifndef TEXTTICKER_H  
  2. #define TEXTTICKER_H  
  3.   
  4.   
  5. #include <QtWidgets/QLabel>  
  6.   
  7.   
  8. class TextTicker : public QLabel  
  9. {  
  10.     Q_OBJECT  
  11.   
  12.   
  13. public:  
  14.     TextTicker(QWidget *parent = 0);  
  15.     ~TextTicker();  
  16.   
  17.   
  18. protected:  
  19.     void paintEvent(QPaintEvent *event);  
  20.     void updateIndex();  
  21.   
  22.   
  23. private:  
  24.     int m_charWidth;  
  25.     int m_curIndex;  
  26.     QString m_showText;  
  27. };  
  28.   
  29.   
  30. #endif // TEXTTICKER_H  

[cpp]  view plain  copy
  1. #include "textticker.h"  
  2. #include <QPainter>  
  3. #include <QTimer>  
  4.   
  5.   
  6. TextTicker::TextTicker(QWidget *parent)  
  7.     : QLabel(parent)  
  8. {  
  9.     setMinimumWidth(200);  
  10.     setMinimumHeight(40);  
  11.   
  12.   
  13.     m_curIndex = 0;//当前角码  
  14.     m_showText = "This is a textTicker Text!";//显示的文字  
  15.     m_charWidth = fontMetrics().width("a");//每个字符的宽度  
  16.   
  17.   
  18.     QTimer *timer = new QTimer(this);  
  19.     connect(timer, &QTimer::timeout, this, &TextTicker::updateIndex);  
  20.     timer->start(100);  
  21. }  
  22.   
  23.   
  24. TextTicker::~TextTicker()  
  25. {  
  26.   
  27.   
  28. }  
  29.   
  30.   
  31. void TextTicker::paintEvent(QPaintEvent *event)  
  32. {  
  33.     __super::paintEvent(event);  
  34.     QPainter painter(this);  
  35.     painter.drawText(0, 30, m_showText.mid(m_curIndex));  
  36.     painter.drawText(width() - m_charWidth*m_curIndex, 30, m_showText.left(m_curIndex));  
  37. }  
  38.   
  39.   
  40. void TextTicker::updateIndex()  
  41. {  
  42.     update();  
  43.     m_curIndex++;  
  44.     if (m_curIndex*m_charWidth > width())  
  45.         m_curIndex = 0;  
  46. }  

猜你喜欢

转载自blog.csdn.net/laughitoff1014/article/details/72857338