Qt/C++ 跑马灯效果~

话不多说直接上源码

.h文件

class TextMovingWidget : public QWidget
{
    Q_OBJECT

public:
    TextMovingWidget(const QString str="" ,QWidget *parent = 0);
    ~TextMovingWidget();
    void setText(const QString&);
protected:
    virtual void paintEvent(QPaintEvent*);
    inline int getDirection(const QString&);
private slots:
    void slot_UpdateTextGeometry();
private:
    QTimer *_timer;
    QString _text;
    int m_direction; //zero means left ,one means right;
    int m_x;
};

.cpp

TextMovingWidget::TextMovingWidget(const QString str ,QWidget *parent)
    : QWidget(parent),_text(str),m_direction(1),m_x(0)
{
    _timer=new QTimer(this);
    connect(_timer,SIGNAL(timeout()),this,SLOT(slot_UpdateTextGeometry()));
    _timer->start(30);
}

TextMovingWidget::~TextMovingWidget(){}

void TextMovingWidget::setText(const QString &t)
{
    _text=t;
    m_x=0;
    update();
}

void TextMovingWidget::paintEvent(QPaintEvent *e)
{
    QWidget::paintEvent(e);
    QPainter p(this);
    p.setPen(Qt::white);
    QFontMetrics metric(font());
    int y=(height()- metric.height())/2;
    p.drawText(m_x,y,metric.width(_text),metric.height(),Qt::AlignLeft,_text);
}

inline int TextMovingWidget::getDirection(const QString &text)
{
    QFontMetrics metrics(font());
    int tw=metrics.width(text);
    if(tw<=width())
    {
        if(m_x+tw>width())
            return 0;
        else if(m_x<=0)
        return 1; 
        return m_direction;
    }
    else
    {
        if(m_x==10)
          return 0;
        else if(m_x<=width()-tw-10)
        return 1; 
        return m_direction;
    }
}

void TextMovingWidget::slot_UpdateTextGeometry()
{
    QFontMetrics metric(font());
    int tw= metric.width(_text);
    if(tw>width()) //If the text width greater than widget width
    {
        if(m_direction) //right
            m_x++;
        else          //left
            m_x--;
    }
    else
    {
        if(m_direction) //right
            m_x++;
        else          //left
            m_x--;
    }
    m_direction=getDirection(_text);
    update();
}

效果就是试试便知~

更多文章:http://blog.csdn.net/what951006
powered by:小乌龟在大乌龟背上

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值