Qt(QLabel)实现滚动字幕

                      欢迎关注公众号可以查看更多完整文章

 

滚动字幕,也叫跑马,就是动态显示一行字符。前面实现是使用QTimer控制,直接在槽函数中截取字符串进行显示,只控制字符串在控件的一端显示,超出控件的部分并没有从控件的另一端循环显示出来。于是我重新实现了一种方法,或者说完善了前面的不足吧。
使用QTimer控制显示的节奏,在paintEvent中进行截取显示。从左端被截掉的部分会从右端显示出来。
难点在于,我们需要依据控件的宽度,控制字符串的显示位置。所以我们还需要知道每个字符的宽度。QWidget提供了方法可以计算字符的宽度,QFontMetrics类可以计算字符或者字符串的宽度,注意是宽度,而不是长度。
实现效果:


计算一个字符所占的宽度:

fontMetrics().width("a");//每个字符的宽度

完整示例代码:

#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

#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;
}

交流QQ:1245178753
本文地址:Qt(QLabel)实现滚动字幕_GreenArrowMan-CSDN博客-CSDN博客
源码下载:http://download.csdn.net/detail/u011417605/9498424

  • 14
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
Qt中使用QLabel实现文字的上下滚动可以通过以下步骤来实现: 1. 创建一个QLabel对象并设置其文本内容。 2. 设置QLabel的固定大小,以确保文本溢出时可以进行滚动。 3. 创建一个QTimer对象用于触发滚动事件。 4. 在滚动事件中,将QLabel的y坐标减少一个固定值,以实现向上滚动效果。 5. 当QLabel滚动到顶部时,将其y坐标重置为初始值,以实现无限滚动的效果。 下面是示例代码实现: ```cpp #include <QtWidgets> class ScrollLabel : public QLabel { public: ScrollLabel(const QString& text, QWidget* parent = nullptr) : QLabel(parent), m_yPos(0) { setText(text); setAlignment(Qt::AlignTop); setFixedSize(200, 100); // 设置固定大小 QTimer* scrollTimer = new QTimer(this); // 创建定时器 connect(scrollTimer, &QTimer::timeout, this, &ScrollLabel::scrollText); // 连接滚动事件 scrollTimer->start(100); // 设置滚动间隔 } private: void scrollText() { m_yPos -= 1; // 向上滚动一个固定值 move(pos().x(), m_yPos); // 更新QLabel的位置 if (m_yPos <= -height()) // 判断是否滚动到顶部 { m_yPos = 0; move(pos().x(), m_yPos); // 重置位置 } } private: int m_yPos; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); ScrollLabel* scrollLabel = new ScrollLabel("这是一个滚动文字", nullptr); scrollLabel->show(); return a.exec(); } ``` 在这个例子中,我们创建了一个名为ScrollLabel的自定义QLabel类,并重写了其滚动事件scrollText。在scrollText函数中,我们不断减少QLabel的y坐标来实现文字的上下滚动。当滚动到顶部时,我们将y坐标重置为初始值,以实现无限滚动的效果。最后,在主函数中创建ScrollLabel对象,并显示出来。 这样,我们就成功地利用QLabel实现文字的上下滚动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenArrowMan

请打钱~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值