Qt-滚动文字显示

ticker.h

#ifndef TICKER_H
#define TICKER_H

#include <QWidget>

class Ticker : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText)

public:
    Ticker(QWidget *parent = nullptr);
    void setText(const QString &newText);
    QString text() const{return myText;}
    QSize sizeHint() const ;
    ~Ticker();
protected:
    void paintEvent(QPaintEvent* event);
    void timerEvent(QTimerEvent* event);
    void showEvent(QShowEvent* event);
    void hideEvent(QHideEvent* event);

private:
    QString myText;
    int offset;
    int myTimerId;
};
#endif // TICKER_H

ticker.cpp

#include "ticker.h"
#include <QtWidgets>
Ticker::Ticker(QWidget *parent)
    : QWidget(parent)
{
    offset = 0;
    myTimerId = 0;
}
void Ticker::setText(const QString &newText)
{
    myText=newText;
    update();
    updateGeometry();
}
QSize Ticker::sizeHint() const
{
    return fontMetrics().size(0,text());
}
void Ticker::paintEvent(QPaintEvent * /*event*/)
{
    QPainter painter(this);
    //获取窗口部件字体相关信息
    int textWidth=fontMetrics().horizontalAdvance(text());
    if(textWidth<1)
        return ;
    int x=-offset;
    while (x<width())
    {
        painter.drawText(x,0,textWidth,height(),Qt::AlignLeft|Qt::AlignCenter,text());
        x+=textWidth;
    }
}

void Ticker::showEvent(QShowEvent */*event*/)
{
    myTimerId=startTimer(100);
}

void Ticker::timerEvent(QTimerEvent *event)
{
    if (event->timerId()==myTimerId)
    {
        ++offset;
        if (offset>=fontMetrics().horizontalAdvance(text()))
            offset=0;
        scroll(-1,0);
    }
    else{
        QWidget::timerEvent(event);
    }
}

void Ticker::hideEvent(QHideEvent */*event*/)
{
    killTimer(myTimerId);
    myTimerId=0;
}
Ticker::~Ticker()
{
}


result:
在这里插入图片描述

posted @ 2020-10-09 21:18  code_witness  阅读(330)  评论(0)    收藏  举报