有界面设计需求就实现了该功能;
#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();
}