Qt实现滚动字幕
2017-06-04 09:43
357 查看
转自http://blog.csdn.net/u011417605/article/details/51211853
滚动字幕,也叫跑马,就是动态显示一行字符。前面实现是使用QTimer控制,直接在槽函数中截取字符串进行显示,只控制字符串在控件的一端显示,超出控件的部分并没有从控件的另一端循环显示出来。于是我重新实现了一种方法,或者说完善了前面的不足吧。
使用QTimer控制显示的节奏,在paintEvent中进行截取显示。从左端被截掉的部分会从右端显示出来。
难点在于,我们需要依据控件的宽度,控制字符串的显示位置。所以我们还需要知道每个字符的宽度。QWidget提供了方法可以计算字符的宽度,QFontMetrics类可以计算字符或者字符串的宽度,注意是宽度,而不是长度。
实现效果:
![](https://img-blog.csdn.net/20160421185252572?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
计算一个字符所占的宽度:
[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;
}
滚动字幕,也叫跑马,就是动态显示一行字符。前面实现是使用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;
}
相关文章推荐
- Qt实现滚动字幕效果
- QT 实现在ui控件QLabel中实现滚动字幕
- QT 实现字幕滚动(上下滚动)
- Qt(QLabel)实现滚动字幕
- qt实现无缝滚动字幕,刷新间隔任意调节
- android TextView 垂直自动滚动字幕实现
- 继承SurfaceView实现滚动字幕组件
- PowerPoint中实现滚动字幕效果
- 在C# WinForm 轻松实现滚动字幕特效的关于窗体
- 用javascript实现代替marquee的滚动字幕效果代码
- 解决qt滚动字幕cpu占用过高的问题
- QT实现简单滚动随机数生成程序
- 用javascript实现代替marquee的滚动字幕效果代码
- android TextView 垂直自动滚动字幕实现
- Winform实现滚动字幕
- android TextView 垂直自动滚动字幕实现
- Winform实现滚动字幕
- c# 滚动字幕的实现
- .net C# 改变VS2005中屏保,实现字幕滚动和字体消隐技术
- c# 滚动字幕的实现