Qt使用事件与定时器实现字幕滚动效果.docx

Qt使用事件与定时器实现字幕滚动效果.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Qt使用事件与定时器实现字幕滚动效果

目录1、效果展示2、实现思路3、滚动窗口部件3.1、成员变量3.2、事件重写3.3、成员方法3.4、方法实现

1、效果展示

我们经常能够在外面看到那种滚动字幕,那么就拿qt来做一个吧。

2、实现思路

实现一个窗口部件,这个窗口部件显示了一串文本标语,它会每t毫秒向左移动一个像素。如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止。

3、滚动窗口部件

创建一个滚动窗口类,将其命名为ticker。

3.1、成员变量

我们需要提供几个成员变量。

myText用来表示要显示的文本内容。offset表示当前偏移量。myTimerId表示定时器的ID编号。

QStringmyText;

intoffset;

intmyTimerId;

3.2、事件重写

需要重新实现了Ticker中的4个事件处理器,分别为paintEvent()、timerEvent()、showEvent()和hideEvent();关于每个事件的职责后面再说。

virtualvoidpaintEvent(QPaintEvent*event)override;//绘制事件

virtualvoidtimerEvent(QTimerEvent*event)override;//定时器事件

virtualvoidshowEvent(QShowEvent*event)override;//显示事件

virtualvoidhideEvent(QHideEvent*event)override;//隐藏事件

3.3、成员方法

还需要提供几个成员方法。关于每个方法的职责后面再说。

voidsetText(constQStringnewText);

QStringtext()const{returnmyText;}

QSizesizeHint()const;

3.4、方法实现

1.构造函数

构造函数把offset变量初始化为0。用来绘制文本的x坐标值就取自于这个offset值。

定时器的ID通常是非零的,所以可以使用0来表示定时器还没有启动。

Ticker::Ticker(QWidget*parent)

:QWidget{parent}

offset=0;

myTimerId=0;

}

2.setText函数

setText()函数用来设置要显示的文本。它调用update()强制执行一个重绘操作,并且调用updateGeometry()通知对Ticker窗口部件负责的布局管理器,提示该窗口部件的大小发生了变化。

voidTicker::setText(constQStringnewText)

myText=newText;

update();

updateGeometry();

}

3.sizeHint函数

sizeHint()函数返回文本所需的空间大小,并以此作为窗口部件的理想尺寸。QWidget::fontMetrics()函数返回一个QFontMetrics对象;可以用这个对象查询并获得与这个窗口部件字体相关的信息。

QSizeTicker::sizeHint()const

returnfontMetrics().size(0,text());

}

4.paintEvent事件

paintEvent()函数使用QPainter::drawText()绘制文本。它使用fontMetrics()确定文本在水平方向上所需要的空间,并且在考虑offset值的同时,多次绘制文本,直到能够填充整个窗口部件的宽度为止。

voidTicker::paintEvent(QPaintEvent*event)

QPainterpainter(this);

inttextWidth=fontMetrics().width(text());

if(textWidth1)

return;

intx=-offset;

while(xwidth())

painter.drawText(x,0,textWidth,height(),Qt::AlignLeft|Qt::AlignVCenter,text());

x+=textWidth;

}

5.timerE

文档评论(0)

139****7676 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档