当前位置: 首页 > 工具软件 > ticker > 使用案例 >

Ticker

蒋高扬
2023-12-01

关于ticker这个例子,陆陆续续看了好几遍一直没搞为什么会滚动着收尾连接绘制,这次通过加打印调试,终于明白是怎么回事了。

#ifndef TICKER_H
#define TICKER_H
#include <QWidget>
using namespace std;
class Ticker : public QWidget
{
    Q_OBJECT

public:
    Ticker(QWidget *parent = 0);
    ~Ticker();

    void setText(const QString &newText);
    QString text() const { return myText;}
    QSize sizeHint() const;

protected:
    void paintEvent(QPaintEvent *event);
    void showEvent(QShowEvent *event);
    void timerEvent(QTimerEvent *event);
    void hideEvent(QHideEvent *event);

private:
    QString myText;
    int offset;
    int myTimerId;
};
#include <QtGui>
#include <qdebug.h>
#include "ticker.h"

Ticker::Ticker(QWidget *parent)
    : QWidget(parent)
{
    offset = 0;
    myTimerId = 0;
    qDebug()<<"aaaaaaaaaaaaaaaaaaaa";
    QString str = tr("浊水清波三万里,愀然独坐孤峰!");
    setText(str);
}

Ticker::~Ticker()
{

}

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 painters(this);
    int textWidth = fontMetrics().width(text());
    qDebug()<<"1.textWidth="<<textWidth<<endl;
    if(textWidth < 1)
        return;
    int x = -offset;
    qDebug()<<"2.x="<<x<<endl;
    qDebug()<<"3.width()="<<width()<<endl;
    while(x < width()) {//-每次while循环会绘制两次,第二次
    //是x+=textWidth 刚好是文本末尾,下一个文本的起始位置。
        painters.drawText(x, 0, textWidth, height(),
                         Qt::AlignLeft | Qt::AlignVCenter, text());
        x += textWidth;
        qDebug()<<"4.x="<<x<<endl;
    }
}

void Ticker::showEvent(QShowEvent *event)
{
    //QObject::startTimer调用会返回一个ID数字,以后可以用这个ID识别该定时器。
    //QObject支持多个独立的定时器,每一个都可以有自己的时间间隔。
    //在startTimer调用大约每30毫秒Qt都会产生一个定时器时间
    myTimerId = startTimer(30);
}

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

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

}

 类似资料:

相关阅读

相关文章

相关问答