qt 文本滚动条

开发项目中学习到的知识,记录一下。文本在qlabel控件中来回滚动

#ifndef SCROLLLABEL_H
#define SCROLLLABEL_H

#include <QObject>
#include <QLabel>
#include <QTimer>
#include <QFont>
class ScrollLabel : public QLabel
{
public:
    ScrollLabel(QWidget *parent = nullptr);

public:
    void paintEvent(QPaintEvent *);
    void UpdateIndex();
    void StartScroll(int p_IsUp, QString p_Str1, QString p_Str2);
    void SetFont(QFont p_Font);
    void SetText(QString p_Str);

private:
    QTimer *m_Timer;
    int m_CurIndex;
    int m_IsUp;
    QString m_Str1;
    QString m_Str2;
    QFont m_Font;
};

#endif // SCROLLLABEL_H
#include "scrolllabel.h"
#include <QPen>
#include <QPainter>
#include <QDebug>

ScrollLabel::ScrollLabel(QWidget *parent): QLabel(parent)
{
    m_CurIndex = 0;
    m_Timer = new QTimer(this);
    m_Timer->setInterval(20);
    connect(m_Timer, &QTimer::timeout, this, &ScrollLabel::UpdateIndex);
}

void ScrollLabel::paintEvent(QPaintEvent *)
{
    QPen pen;
    pen.setColor(QColor(255,255,255));

    QPainter painter(this);
    painter.setPen(pen);
    painter.setFont(m_Font);

    QFontMetrics FontMetrics(m_Font);

    int Str1Width = FontMetrics.width(m_Str1);//字符的宽度
    int Str2Width = FontMetrics.width(m_Str2);//字符的宽度
    int CharWidth = FontMetrics.width("a");//每个字符的宽度

    int Interval = (width() - Str1Width)/2;
    int Interval2 = (width() - Str2Width)/2;

    if(0 == m_CurIndex)
    {
        painter.drawText(Interval , 22, m_Str1);
    }
    else
    {
        if(m_IsUp)
        {
            painter.drawText(Interval+CharWidth*m_CurIndex, 22, m_Str1);
            painter.drawText(CharWidth*m_CurIndex - Str2Width + (Interval - Interval2), 22, m_Str2);

            if(Interval + CharWidth*m_CurIndex > width())
            {
                m_Timer->stop( );
                m_CurIndex = 0;
            }
        }
        else
        {
            painter.drawText((width() -Str1Width)/2-CharWidth*m_CurIndex, 22, m_Str1);
            painter.drawText(width() - CharWidth*m_CurIndex+(Interval2 - Interval), 22, m_Str2);

            if(Interval + Str1Width < CharWidth*m_CurIndex)
            {
                m_Timer->stop( );
                m_CurIndex = 0;
            }
        }

    }
}

void ScrollLabel::UpdateIndex()
{
    update();
    m_CurIndex++;
}


void ScrollLabel::SetFont(QFont p_Font)
{
    m_Font = p_Font;
}

void ScrollLabel::SetText(QString p_Str)
{
    m_Str1 = p_Str;
    update();
}

void ScrollLabel::StartScroll(int p_IsUp, QString p_Str1, QString p_Str2)
{
    m_IsUp = p_IsUp;
    m_Str1 = p_Str1;
    m_Str2 = p_Str2;
    m_Timer->start( );
}

调用方法:

m_total_mileage_text_label = new ScrollLabel(this);

//开始滚动
m_total_mileage_text_label->StartScroll(IsUp, Str1, Str2);

IsUp 1:指滚向上一条 0:滚向下一条
str1和str2分别指滚动前的字符串和滚动后的字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿木小呆呆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值