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: