参考某大神博客,针对自己的需求,实现了跑马灯效果。
效果如下:
思路:
1,启动定时器 进行刷新
my_timer_id_ = startTimer(10, Qt::PreciseTimer);
2,每触发一次定时器,偏移量增加固定大小。 void Ticker::leftScrollTimerEvent(QTimerEvent *ev)
offset_ ++;
同时对控件面板上的内容左移1pixel。这样相当于控件面板左上角坐标为(0,0);但是面板最左边坐标为(-1,0)
scroll(offset_,0);
3,每刷新一次 重新绘制文字
painter.drawText(x_coordinate,
height()/2-text_height/2,
text_width,
text_height,
Qt::AlignHCenter | Qt::AlignVCenter,
getSText());
4,当文字 移动到左侧消失时,重新从右侧开始移动
if((offset_-fontMetrics().width(getSText()))>=width()){
scroll(offset_,0);
offset_ = 0;
stop();
emit finish();
}
主要代码:
#pragma once
#include
#include
#include
QT_BEGIN_NAMESPACE
class QHideEvent;
class QShowEvent;
class QTimerEvent;
class QPaintEvent;
QT_END_NAMESPACE
class Ticker : public QLabel
{
Q_OBJECT
//Q_PROPERTY(QString my_text_ READ getText WRITE setText)
public:
explicit Ticker(QWidget *parent = 0);
virtual QSize sizeHint() const;
QString getSText() const;
void setParam(const QString &sFontName,
const QString &sFontSize,
const QString &sColor,
const QString &sSpeed,
const QString &sText);
protected:
virtual void hideEvent(QHideEvent* ev);
virtual void timerEvent(QTimerEvent* ev);
virtual void paintEvent(QPaintEvent* ev);
private:
void leftScrollTimerEvent(QTimerEvent* ev);
void leftScrollPaintEvent(QPaintEvent* ev);
private:
//走马灯的偏移量
int offset_;
//定义的时钟id
int my_timer_id_;
QString m_sFontName;
QString m_sFontSize;
QString m_sColor;
int m_sSpeed;
QString m_sText;
public slots:
void start();
void stop();
signals:
void finish();
};
#include "ticker.h"
#include
#include
#include
#include
#include
#include
Ticker::Ticker(QWidget *parent) :
QLabel(parent),
offset_(0),
my_timer_id_(0),
m_sText(QStringLiteral("欢迎光临 ")),
m_sFontSize("50"),
m_sColor("255,0,0,255"),
m_sFontName("SimSun")
{
}
void Ticker::start()
{
//创建timer,并返回timer的id
my_timer_id_ = startTimer(10, Qt::PreciseTimer);
}
void Ticker::stop()
{
killTimer(my_timer_id_);
my_timer_id_ = 0;
}
QSize Ticker::sizeHint() const
{
//2倍高度
/*int height = fontMetrics().size(Qt::TextSingleLine, getSText()).height();
int width = fontMetrics().size(Qt::TextSingleLine, getSText()).width();
return QSize(width * 2.3, 5 * height);*/
//根据文本内容,设定文本框显示尺寸
return (fontMetrics().size(Qt::TextSingleLine, getSText()));
}
void Ticker::hideEvent(QHideEvent *ev)
{
Q_UNUSED(ev)
//根据timer的id终止timer
killTimer(my_timer_id_);
my_timer_id_ = 0;
}
void Ticker::timerEvent(QTimerEvent *ev)
{
leftScrollTimerEvent(ev);
}
void Ticker::paintEvent(QPaintEvent *ev)
{
leftScrollPaintEvent(ev);
}
void Ticker::leftScrollTimerEvent(QTimerEvent *ev)
{
if (ev->timerId() == my_timer_id_) {
//++offset_;
//速度设置
if(m_sSpeed<0)
m_sSpeed=0;
if(m_sSpeed>10)
m_sSpeed=10;
offset_+=m_sSpeed;
if((offset_-fontMetrics().width(getSText()))>=width()){
scroll(offset_,0);
offset_ = 0;
stop();
emit finish();
}
scroll(-1, 0);
} else {
QWidget::timerEvent(ev);
}
}
void Ticker::leftScrollPaintEvent(QPaintEvent *ev)
{
Q_UNUSED(ev)
QPainter painter(this);
const int text_width(fontMetrics().width(getSText()));
const int text_height(fontMetrics().height());
if (text_width < 1) {
return;
}
int x_coordinate(width()-offset_);
painter.drawText(x_coordinate,
height()/2-text_height/2,
text_width,
text_height,
Qt::AlignHCenter | Qt::AlignVCenter,
getSText());
}
QString Ticker::getSText() const
{
return m_sText;
}
void Ticker::setParam(const QString &sFontName, const QString &sFontSize, const QString &sColor, const QString &sSpeed, const QString &sText)
{
m_sFontName = sFontName;
m_sText = sText;
m_sFontSize = sFontSize;
m_sColor = sColor;
m_sSpeed = sSpeed.toInt();
QString r="255",g="0",b="0",a="255";
QStringList colorList = m_sColor.split(":");
if(colorList.count()==4){
r=colorList.at(0);
g=colorList.at(1);
b=colorList.at(2);
a=colorList.at(3);
}
QString styleStr = QString("background-color: rgb(0, 0, 0);\n"
"color: rgb(%1, %2, %3,%4);\n"
"font: %5pt \"%6\";").arg(r).arg(g).arg(b).arg(a).arg(m_sFontSize).arg(m_sFontName);
qDebug()<<"style:"<setStyleSheet(styleStr);
//布局管理器更新布局设置
updateGeometry();
}
参考:https://my.oschina.net/weiweiqiao/blog/334931