Qt QLabel 文字滚动 滚动字幕

1.实现效果

做了两种实现方式,像素滚动比较顺滑。

支持QLabel样式表设置字体颜色边框等。
支持实时缩放。

  • 蓝色 字符滚动
  • 红色 像素滚动

在这里插入图片描述
在这里插入图片描述

2.简述

实现思路1
准备足够显示满宽的字符,每次删除最左边的一个字符,不够显示的时候,在后边追加字符。

实现思路2
画一个宽度是Label宽度+文本宽度的文本框,从x=0开始,每次将文本框的起始位置减1。当一个完整文本宽度被减完之后,重新从x=0开始画。

实现1


#include "CRollLabel.h"
#include <QPainter>
#include <QDebug>
CRollLabel::CRollLabel(QWidget *parent)
    : QLabel(parent)
{
    this->startTimer(300);
}

void CRollLabel::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    if(0 == m_nCharWidth)
        return ;

    QPainter painter(this);
    m_strDrawText = m_strText.mid(m_nCurrentIndex);
    while((m_strDrawText.size() * m_nCharWidth) <= width()){
        m_strDrawText += m_strText + " ";
    }
    painter.drawText(rect(),alignment(),m_strDrawText);
}

void CRollLabel::timerEvent(QTimerEvent *event)
{
    Q_UNUSED(event)

    m_strText = text();
    if(!m_strText.isEmpty()){
        int nSumWidth = fontMetrics().width(m_strText);
        m_nCharWidth = nSumWidth/m_strText.size();
    }

    m_nCurrentIndex++;
    if(m_nCurrentIndex > m_strText.size()){
        m_nCurrentIndex = 0;
    }

    update();
}

----------------------------------------以上是源文件,以下是头文件
#ifndef CROLLLABEL_H
#define CROLLLABEL_H

#include <QLabel>
#include <QTimerEvent>

class CRollLabel : public QLabel
{
    Q_OBJECT
public:
    explicit CRollLabel(QWidget *parent = nullptr);

public:
    void setInterVal(int nInterVal){startTimer(nInterVal);}
protected:
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent *event);
private:
    int m_nCharWidth = 0;
    int m_nCurrentIndex = 0;
    QString m_strText;
    QString m_strDrawText;
};

#endif // CROLLLABEL_H

实现2

#include "CScrollLabel.h"
#include <QPainter>
#include <QDebug>

CScrollLabel::CScrollLabel(QWidget *parent) : QLabel(parent)
{
    this->startTimer(100);
}


void CScrollLabel::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    QRectF rectText = rect();
    rectText.setWidth(width() + m_nTextWidth);
    rectText.setX(-m_nCurrentIndex);
    painter.drawText(rectText,alignment(),m_strDrawText);
}

void CScrollLabel::timerEvent(QTimerEvent *event)
{
    Q_UNUSED(event)
    if(text().isEmpty())
        return ;

    if(m_strText != text()){
        m_strText = text();
        m_nCurrentIndex = 0;
        m_nTextWidth = fontMetrics().width(m_strText);
    }

    while(fontMetrics().width(m_strDrawText) < width() + m_nTextWidth){
        m_strDrawText += text();
    }

    m_nCurrentIndex++;
    if(m_nCurrentIndex == m_nTextWidth){
        m_nCurrentIndex = 0;
    }

    update();
}

----------------------------------------以上是源文件,以下是头文件

#ifndef CSCROLLLABEL_H
#define CSCROLLLABEL_H

#include <QLabel>
#include <QTimerEvent>

class CScrollLabel : public QLabel
{
    Q_OBJECT
public:
    explicit CScrollLabel(QWidget *parent = nullptr);

public:
    void setInterVal(int nInterVal){startTimer(nInterVal);}
protected:
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent *event);
private:
    int m_nCharWidth = 0;
    int m_nCurrentIndex = 0;        //文本起始x点
    int m_nTextWidth = 0;
    QString m_strText;
    QString m_strDrawText;
};

#endif // CSCROLLLABEL_H


  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
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实现了文字的上下滚动效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是唐

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值