Qt使用事件(event)与定时器实现字幕滚动

news/2024/11/22 22:45:44/

目录

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


1、效果展示

我们经常能够在外面看到那种滚动字幕,那么就拿qt来做一个吧。
在这里插入图片描述

2、实现思路

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

3、滚动窗口部件

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

3.1、成员变量

我们需要提供几个成员变量。
myText用来表示要显示的文本内容。
offset表示当前偏移量。
myTimerId表示定时器的ID编号。

    QString myText;int offset;int myTimerId;

3.2、事件重写

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

    virtual void paintEvent(QPaintEvent* event) override; // 绘制事件virtual void timerEvent(QTimerEvent* event) override; // 定时器事件virtual void showEvent(QShowEvent* event) override; // 显示事件virtual void hideEvent(QHideEvent* event) override; // 隐藏事件

3.3、成员方法

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

void setText(const QString& newText);QString text() const { return myText; }QSize sizeHint() const;

3.3、方法实现

构造函数
构造函数把 offset变量初始化为0。用来绘制文本的x坐标值就取自于这个offset 值。
定时器的ID通常是非零的,所以可以使用0来表示定时器还没有启动。

Ticker::Ticker(QWidget *parent): QWidget{parent}
{offset = 0;myTimerId = 0;
}

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

void Ticker::setText(const QString &newText)
{myText = newText;update();updateGeometry();
}

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

QSize Ticker::sizeHint() const
{return fontMetrics().size(0, text());
}

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

void Ticker::paintEvent(QPaintEvent *event)
{QPainter painter(this);int textWidth = fontMetrics().width(text());if(textWidth < 1){return;}int x = -offset;while(x < width()){painter.drawText(x, 0, textWidth, height(), Qt::AlignLeft | Qt::AlignVCenter, text());x += textWidth;}
}

timerEvent定时器事件
系统每隔一定时间,都会调用一次timerEvent()函数。
通过在offset上加1来模拟移动,从而形成文本宽度的连续滚动。然后,它使用QWidget::scroll()把窗口部件的内容向左滚动一个像素。
如果这个定时器事件不是我们所关注的那个定时器,就可以把它传递给基类。

这里也可以调用update()代替scrol(),但使用scroll()会更有效率,因为它只是简单地移动屏幕上已经存在的像素并且只对这个窗口部件的新显示区域(此时,只是一个1像素乘以宽度的像素条)产生一个绘制事件。

void Ticker::timerEvent(QTimerEvent *event)
{if(event->timerId() == myTimerId){++offset;if(offset >= fontMetrics().width(text())){offset = 0;}scroll(-1, 0);}else{QWidget::timerEvent(event);}
}

showEvent显示事件
showEvent()函数用来启动个定时器。QObject::startTimer()调用会返回一个ID数字,用这个数字识别该定时器。QObject支持多个独立的定时器,每一个都可以有自己的时间间隔。
startTimer()调用之后,大约每30毫秒Qt都会产生一个定时器事件。至于具体的时间精度,则取决于所在的操作系统。

我们也可以在Ticker的构造函数中完成startTimer()的调用,但是只有在窗口部件实际可见的时候,
才有必要保存由Qt产生的定时器事件的那些资源。让资源合理利用。

void Ticker::showEvent(QShowEvent *event)
{Q_UNUSED(event);myTimerId = startTimer(30);
}

hideEvent隐藏事件
hideEvent()函数调用QObject::killTimer()来停止该定时器。

void Ticker::hideEvent(QHideEvent *event)
{killTimer(myTimerId);myTimerId = 0;
}

定时器事件是一种低级事件,而且如果需要多个定时器时,保持对所有定时器ID的跟踪将会变得很麻烦。
在这种情况下,通常更为简单的方式是为每一个定时器分别创建一个QTimer对象。QTimer会在每个时间间隔发射timeout()信号。当然QTimer也提供了一个非常方便的接口,可用于单触发定时器(只触发一次的定时器)QTimer::singleShot(t, this, &Ticker::onTimer);


http://www.ppmy.cn/news/706146.html

相关文章

144项ppt制作技术

1. 两幅图片同时动作 PowerPoint的动画效果比较多&#xff0c;但图片只能一幅一幅地动作。如果你有两幅图片要一左一右或一上一下地向中间同时动作&#xff0c;可就麻烦了。其实办法还是有的&#xff0c;先安置好两幅图片的位置&#xff0c;选中它们&#xff0c;将之组合起来&a…

PPT高级教程及技巧 .

PPT高级教程及技巧 时间:2010-04-12 http://www.misterlv.com/a/jiagongjishu/2010/0412/7.html 1. 两幅图片同时动作 PowerPoint的动画效果比较多&#xff0c;但图片只能一幅一幅地动作。如果你有两幅图片要一左一右或一上一下地向中间同时动作&#xff0c;可就麻烦了。其实…

[转发]ASP.NET Core2集成Office Online Server(OWAS)实现办公文档的在线预览与编辑(支持word\excel\ppt\pdf等格式)...

转载自&#xff1a;https://www.cnblogs.com/Andre/p/9549874.html Office Online Server是微软开发的一套基于Office实现在线文档预览编辑的技术框架&#xff08;支持当前主流的浏览器&#xff0c;且浏览器上无需安装任何插件&#xff0c;支持word、excel、ppt、pdf等文档格式…

B站五面面经(附过程、答案)

有情怀&#xff0c;有干货&#xff0c;微信搜索【三太子敖丙】关注这个有一点点东西的程序员。 本文 GitHub https://github.com/JavaFamily 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 上周午休我刷手机的时候看到26群在那疯狂刷恭喜&#xff0c;我以…

带口罩也能解锁iPhone!中国网友用一张白纸骗过Face ID,外国网友把脸印在口罩上

受新冠疫情影响&#xff0c;出门要带口罩、在办公场所也要带口罩&#xff0c;随之而来的一个问题是&#xff1a;我的iPhone不认识我了&#xff0c;面部识别解锁手机挂了&#xff0c;天天输入密码解锁真的很麻烦…… 然而就在这几天&#xff0c;陆续看到很多朋友表示自己的iPhon…

如何像阿里工程师一样高效办公?

原文链接 上周&#xff0c;阿里巴巴总市值达到3565亿美元&#xff0c;再次超越腾讯&#xff0c;成为亚洲市值最高的公司。在阿里庞大的经济体量背后&#xff0c;究竟是何种智能、高效的信息化系统支撑着它不断前进&#xff1f;阿里人究竟是如何办公的&#xff1f; 在6月10日召开…

Spring Boot/Spring Cloud 集成Page Office支持word、excel、ppt在线浏览编辑

最近做项目用到word、excel的在线浏览编辑功能&#xff0c;在网上找了很多的工具软件&#xff0c;一开始用的是office-online-server&#xff0c;参考office官网文档&#xff0c;最后领导认为他的样式过于简单&#xff0c;支持功能比较少&#xff0c;所以撤换掉用了page office…

塞北村镇旅游网站设计(论文+PPT+源码)

此处为论文中文题目&#xff0c;要求居中填写 主标题不超过24个汉字&#xff1b;可加副标题&#xff08;副标题前加破折号&#xff09;&#xff0c;副标题与主标题间空一行的位置 主标题&#xff1a;黑体&#xff0c;小二&#xff0c;居中 副标题&#xff1a;楷体_GB2312&#…