一、项目介绍
利用QTimer实现字幕滚动功能,可以实现自行更改文本内容、自适应文本大小、自由调整速度等功能。
二、项目基本配置
新建一个Qt案例,项目名称为“TextScroll”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。
三、UI界面设计
无UI界面
四、主程序实现
4.1 widget.h头文件
声明私有变量和事件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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); |
声明函数和槽函数:
1
2
3
4
5
6
7
8
|
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源文件
主函数内容如下:
1
2
3
4
5
6
7
8
9
10
11
|
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()槽函数:
1
2
3
4
5
6
7
8
9
10
11
|
//槽函数 void Widget::timeOut(){ qDebug()<<m_moveOffset<<m_moveSize; m_moveOffset+=m_pixelSize; if (m_moveOffset>m_moveSize) { m_moveOffset= 0; } update(); } |
调整窗口大小resizeEvent事件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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<blankLine;i++) { m_showText.insert(0, " " ); //开头插入blankLine个空格 } m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix; m_moveOffset=0; update(); } |
重写绘制事件paintEvent:
1
2
3
4
5
6
7
8
9
10
11
12
|
//绘图事件 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); //绘制文字,水平居左垂直居中 } |
定义滚动延迟函数:
1
2
3
4
5
6
7
|
//设置滚动延迟,多少ms滚动多少像素点pixelSize void Widget::setDelay( int ms, int pixelSize) { this ->m_ms=ms; this ->m_pixelSize=pixelSize; } |
设置字体相关信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
//设置字体相关信息(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;i<blankLine;i++) { m_showText.insert(0, " " ); //开头插入blankLine个空格 } m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix; m_moveOffset=0; //如果计时器没有运行 if (!timer->isActive()) { if (m_ms) { timer->start(m_ms); //启动计时,以m_ms为间隔 } } } |
五、效果演示
完整效果如下:
以上就是Qt实现字幕滚动效果的示例代码的详细内容,更多关于Qt字幕滚动的资料请关注服务器之家其它相关文章!
原文链接:https://wendy.blog.csdn.net/article/details/122491399