Qt 标题栏实现滚动显示也可以根据显示字符长度自动居中或滚动显示

有界面设计需求就实现了该功能;

#include "ScrollingLabel.h"

ScrollingLabel::ScrollingLabel(QWidget *parent)
    : QLabel(parent), m_mode(SCROLL_AUTO),m_display_mode(1),m_speed(20), m_offset(0), m_totalWidth(0), fontsize(20),lagerWith(0),m_text(""), m_timer(new QTimer(this))
{
    resize(150,80);
    setStyleSheet("background-color: orange; font-size: 25px;");
    setFontSize(1);
    m_timer->setInterval(m_speed);
    connect(m_timer, &QTimer::timeout, this, &ScrollingLabel::updatePosition);
}

ScrollingLabel::~ScrollingLabel()
{
    delete m_timer;
}
void ScrollingLabel::setFontSize(int size)
{
    QFont font = this->font();
    font.setPointSize(size);
    this->setFont(font);
    update();
}
void ScrollingLabel::setText(const QString &text)
{
    // 设置新文本
    m_text = text;
    // 当字体大小改变时,重新计算文本宽度
    m_totalWidth = fontMetrics().horizontalAdvance(m_text)+30;
    lagerWith=m_totalWidth-width();
    m_timer->stop();
    // 初始位置应从屏幕宽度开始,以确保从右侧开始滚动
    m_offset = width();
    if(m_mode==SCROLL)
    {
        m_display_mode=DISPLAY_SCROLL;
    }
    else
    {
        if(lagerWith>0)
        {
            m_display_mode=DISPLAY_SCROLL;
        }
        else
        {
            m_totalWidth = fontMetrics().horizontalAdvance(m_text);
            m_display_mode=DISPLAY_MIDDLE;
        }
    }

    // 启动定时器
    if(m_display_mode==DISPLAY_SCROLL)
    {
        m_timer->start();
    }
    else
    {
        update();
    }
}

void ScrollingLabel::setScrollSpeed(int speed)
{
    m_speed = speed;
    m_timer->setInterval(m_speed);
}

void ScrollingLabel::setmode(int mode)
{
    m_timer->stop();
    m_offset = width();
    m_mode=mode;
    if(m_mode==SCROLL)
    {
        m_display_mode=DISPLAY_SCROLL;
    }
    else
    {
        if(lagerWith>0)
        {
            m_display_mode=DISPLAY_SCROLL;
        }
        else
        {
            m_totalWidth = fontMetrics().horizontalAdvance(m_text);
            m_display_mode=DISPLAY_MIDDLE;
        }
    }

    // 启动定时器
    if(m_display_mode==DISPLAY_SCROLL)
    {
        m_timer->start();
    }
    else
    {
        update();
    }
}

int ScrollingLabel::getmode()
{
    return m_mode;
}

void ScrollingLabel::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    if(m_display_mode==DISPLAY_SCROLL)
    {
        painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿

        // 计算绘制文本的实际位置
        int x = m_offset ;
        painter.drawText(x, rect().center().y()+fontMetrics().height() / 4 , m_text);
        // 如果文本已经部分离开屏幕左侧,重复绘制以形成无缝滚动效果
        if (m_offset < 0) {
            if(lagerWith>0)
            {
                painter.drawText(width() + x+lagerWith, rect().center().y() +fontMetrics().height() / 4, m_text);
            }
            else
            {
                painter.drawText(width() + x, rect().center().y() +fontMetrics().height() / 4, m_text);
            }
        }
    }
    else
    {
        painter.drawText(width()/2-m_totalWidth/2, rect().center().y() +fontMetrics().height() / 4, m_text);
    }
}

void ScrollingLabel::resizeEvent(QResizeEvent *event)
{
    QLabel::resizeEvent(event);

    // 更新与尺寸相关的变量
    m_offset = width(); // 文本应从新的窗口宽度右侧开始滚动
    m_timer->stop();
    m_timer->start();
}
void ScrollingLabel::updatePosition()
{
    m_offset -= 1; // 每次定时器事件滚动一个像素

    // 当文本完全离开左边视图时,重置其位置到右侧
    if (m_offset <= -m_totalWidth) {
        if(lagerWith>0)
        {
            m_offset = width() - m_totalWidth+lagerWith;
        }
        else
        {
            m_offset = width() - m_totalWidth;
        }
    }

    update();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值