Qt:Ticker窗口部件

项目文件列表:
在这里插入图片描述
项目运行效果:
在这里插入图片描述
头文件:
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 = 0);

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

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

cpp文件:
ticker.cpp:

#include <QtGui>

#include "ticker.h"

Ticker::Ticker(QWidget *parent)
    : QWidget(parent)
{
	//构造函数把offset变量初始化为0.用来绘制文本的x坐标值就取自于这个offset值
    offset = 0;
	//定时器的ID通常是非零的,所以可以使用0来表示定时器还没有启动
    myTimerId = 0;
}

/**
 * @brief Ticker::setText
 * @param newText
 * setText()函数用来设置要显示的文本。它调用update()函数强制执行一个重绘操作,并且调用updateGeometry()
 * 通知对Ticker窗口部件负责的任意布局管理器,提示该窗口部件的大小发生了变化。
 */
void Ticker::setText(const QString &newText)
{
    myText = newText;
    update();//执行重绘操作
    updateGeometry();//通知对Ticker窗口部件负责的任意布局管理器,提示该窗口部件的大小发生了变化
}

/**
 * @brief Ticker::sizeHint
 * @return 
 * sizeHint()函数返回文本所需的空间大小,并以此作为窗口部件的理想尺寸。
 */
QSize Ticker::sizeHint() const
{
	/*
	 * QWidget::fontMetrics()函数返回一个QFontMetrics对象,可以利用这个对象查询并获得与这个窗口部件
	 * 字体相关的信息。在这种情况下,可以询问给定文本所需的必要大小。QFontMetrics::size()的第一个参数是
	 * 一个标识符,对于那些比较简单的字符串来讲并不需要它,因而只给它传递了一个0值。
	 */
    return fontMetrics().size(0, text());
}

/**
 * @brief Ticker::paintEvent
 * paintEvent()函数使用drawText()绘制文本。它使用fontMetrics()确定文本在水平方向上所需的空间,并且在考虑
 * offset值的同时,多次绘制文本,直到能够条填充整个窗口部件的宽度为止。
 */
void Ticker::paintEvent(QPaintEvent * /* event */)
{
	//创建一个QPainter对象
    QPainter painter(this);

	//获得文本的宽度(即文本的长度)
    int textWidth = fontMetrics().width(text());
    if (textWidth < 1)//文本的得长度小于1,即文本为空
        return;
    int x = -offset;
    while (x < width()) {
        painter.drawText(x, 0, textWidth, height(),
                         Qt::AlignLeft | Qt::AlignVCenter, text());
        x += textWidth;//将文本出现的水平坐标向后移动
    }
}

/**
 * @brief Ticker::showEvent
 * showEvent()函数用来启动一个定时器。QObject::startTimer()调用会返回一个ID数字,可以
 * 在以后用这个数字识别该定时器。
 */
void Ticker::showEvent(QShowEvent * /* event */)
{
    myTimerId = startTimer(30);
}

/**
 * @brief Ticker::timerEvent
 * @param event
 * 系统每个一定的时间,都会调用一次timerEvent()函数。它通过在offset上加1来模拟移动,从而形成
 * 文本宽度的连续滚动。然后,它使用QWidget::scroll()把窗口部件的内容向左滚动一个像素。
 */
void Ticker::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == myTimerId) {
        ++offset;
        if (offset >= fontMetrics().width(text()))
            offset = 0;
        scroll(-1, 0);
    } else {
        QWidget::timerEvent(event);
    }
}

/**
 * @brief Ticker::hideEvent
 * 
 */
void Ticker::hideEvent(QHideEvent * /* event */)
{
	//QObject::killTimer()用来停止定时器
    killTimer(myTimerId);
    myTimerId = 0;
}

ticker.cpp:

#include <QApplication>

#include "ticker.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Ticker ticker;
    ticker.setWindowTitle(QObject::tr("Ticker"));
    ticker.setText(QObject::tr("How long it lasted was impossible to "
                               "say ++ "));
    ticker.show();
    return app.exec();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值