QScrollLabel——简单的滚动文本

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

一个小玩意儿,大家有需要的也可以自己改进一下。

猜你喜欢

转载自blog.csdn.net/q294971352/article/details/82222532