版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q294971352/article/details/82222532
最近又在用Qt写上位机,需要使用到滚动显示的功能,然后百度一下,大概有两种方法,不过核心都是使用定时器刷新显示的文本:
方法一:
设置好label的text过后,启动一个定时器,然后每次触发定时器事件后,根据显示的索引,显示string后面的内容:
// 当截取的位置比字符串长时,从头开始
if (nPos > strScrollCation.length())
nPos = 0;
m_pLabel->setText(strScrollCation.mid(nPos));
nPos++;
方法二:
自己写一个QLabel的子类,重写paintEvent函数:
#ifndef QSCROLLLABEL_H
#define QSCROLLLABEL_H
#include <QLabel>
#include <QTimer>
class QScrollLabel : public QLabel
{
Q_OBJECT
private:
static constexpr int DefaultStepWidth = 1;
static constexpr int DefaultStepTime = 100;
static constexpr int MinScrollTime = 1;
static constexpr int MaxScrollTime = 500;
public:
explicit QScrollLabel(QWidget *parent = nullptr);
~QScrollLabel();
void start(void);
void stop(void);
void setSpeed(qreal speed);
signals:
void displayFinished(void);
private slots:
void updateIndex(void);
private:
void paintEvent(QPaintEvent *event);
private:
QTimer *m_scrollTimer;
int m_stepWidth;
int m_stepTime;
int m_curIndex;
};
#endif // QSCROLLLABEL_H
#include <float.h>
#include <QPainter>
#include "qscrolllabel.h"
QScrollLabel::QScrollLabel(QWidget *parent) :
QLabel(parent),
m_scrollTimer(new QTimer(this)),
m_stepWidth(DefaultStepWidth),
m_stepTime(DefaultStepTime),
m_curIndex(0)
{
connect(m_scrollTimer, &QTimer::timeout, this, &QScrollLabel::updateIndex);
}
QScrollLabel::~QScrollLabel()
{
}
/**
* @brief Start rolling.
*
*/
void QScrollLabel::start(void)
{
m_scrollTimer->start(m_stepTime);
}
/**
* @brief Stop rolling.
*
*/
void QScrollLabel::stop(void)
{
m_scrollTimer->stop();
}
/**
* @brief Set rolling speed.
*
* @param speed: multiple of current speed
*
*/
void QScrollLabel::setSpeed(qreal speed)
{
int minTime = MinScrollTime;
int maxTime = MaxScrollTime;
/* stop rolling while speed equal zero */
if (speed >= -DBL_EPSILON && speed <= DBL_EPSILON) {
m_scrollTimer->stop();
} else {
/* time smaller, speed faster */
m_stepTime *= speed;
m_stepTime = std::max(m_stepTime, minTime); // set speed bigger than Min speed
m_stepTime = std::min(m_stepTime, maxTime); // set speed smaller than Max speed
m_scrollTimer->start(m_stepTime);
}
}
/**
* @brief Timeout handler for updating display index.
*
*/
void QScrollLabel::updateIndex(void)
{
this->update();
/* update index of display area */
m_curIndex++;
if (m_curIndex * m_stepWidth > this->width()) {
m_curIndex = 0;
}
}
/**
* @brief Paint event of widget, main function to display text.
*
* @param event: event of current paint device.
*
*/
void QScrollLabel::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
/* display left part of text */
painter.drawText(0 - m_stepWidth * m_curIndex, this->height(), this->text());
/* display right part of text */
painter.drawText(this->width() - m_stepWidth * m_curIndex, this->height(), this->text().left(m_curIndex));
/* Do not call parent paintevent,
* otherise will display text twice
*/
// QLabel::paintEvent(event);
}
一个小玩意儿,大家有需要的也可以自己改进一下。