Qt 实现跑马灯效果

参考某大神博客,针对自己的需求,实现了跑马灯效果。

效果如下:

 

思路:

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 <QLabel>
#include <QTimer>

#include <QWidget>

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 <QHideEvent>
#include <QShowEvent>
#include <QTimerEvent>
#include <QPainter>
#include <QPaintEvent>
#include <QtDebug>


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:"<<styleStr<<m_sFontSize;
    this->setStyleSheet(styleStr);

    //布局管理器更新布局设置
    updateGeometry();
}

 

参考:https://my.oschina.net/weiweiqiao/blog/334931

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值