一、项目介绍
利用qtimer实现字幕滚动功能,可以实现自行更改文本内容、自适应文本大小、自由调整速度等功能。
二、项目基本配置
新建一个qt案例,项目名称为“textscroll”,基类选择“qwidget”,取消创建ui界面复选框的选中状态,完成项目创建。
三、ui界面设计
无ui界面
四、主程序实现
4.1 widget.h头文件
声明私有变量和事件:
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: 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源文件
主函数内容如下:
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()槽函数:
//槽函数 void widget::timeout(){ qdebug()<<m_moveoffset<<m_movesize; m_moveoffset+=m_pixelsize; if(m_moveoffset>m_movesize) { m_moveoffset= 0; } update(); }
调整窗口大小resizeevent事件:
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:
//绘图事件 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);//绘制文字,水平居左垂直居中 }
定义滚动延迟函数:
//设置滚动延迟,多少ms滚动多少像素点pixelsize void widget::setdelay(int ms,int pixelsize) { this->m_ms=ms; this->m_pixelsize=pixelsize; }
设置字体相关信息:
//设置字体相关信息(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字幕滚动的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!
需要了解更多c/c++开发分享Qt实现字幕滚动效果的示例代码,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/1237838.html