• 大小: 30KB
    文件类型: .tar
    金币: 2
    下载: 0 次
    发布日期: 2024-02-02
  • 语言: 其他
  • 标签: Qt  

资源简介

这是一个比Qt学习书上例子更精进的Demo,用Qt绘制一个时钟,添加了秒针功能。

资源截图

代码片段和文件信息

#include “clock.h“
#include 
#include 
#include 
#include 
#include 
#include 

Clock::Clock(QWidget *parent)
    : QWidget(parent)
{
    QTimer *timer = new QTimer(this);   //声明一个定时器
    //update()会自动产生重绘消息,调用paintEvent()
    connect(timer SIGNAL(timeout()) this SLOT(update()));  //连接信号槽,定时器超时触发窗体更新
    timer->start(1000);   //启动定时器
    setWindowtitle(tr(“My Clock“));  //设置窗体名称
    resize(300 300);  //设置窗体大小
}

Clock::~Clock()
{

}

void Clock::paintEvent(QPaintEvent *event)
{
    //下面三个数组用来定义表针的三个顶点,以便后面的填充
    static const QPoint hourHand[3] = {
        QPoint(3 8)
        QPoint(-3 8)
        QPoint(0 -40)
    };
    static const QPoint minuteHand[3] = {
        QPoint(3 8)
        QPoint(-3 8)
        QPoint(0 -70)
    };
    static const QPoint secondHand[3] = {
        QPoint(3 8)
        QPoint(-3 8)
        QPoint(0 -90)
    };//秒针
    //填充表针的颜色
    QColor hourColor(127 0 127);  //分针颜色(第四个表示不透明度)
    QColor minuteColor(0 127 127 191);
    QColor secondColor(127 127 0 127);

    int side = qMin(width() height());  //绘制的范围(宽、高中最小值)
    QTime time = QTime::currentTime();   //获取当前的时间
    QPainter painter(this);              //声明用来绘图用的painter

    painter.setRenderHint(QPainter::Antialiasing);//绘制的图像反锯齿
    painter.translate(width() / 2 height() / 2);//重新定位坐标起始点,把坐标原点放到窗体的中央
    painter.scale(side / 300.0 side / 300.0);//设定画布的边界用窗体宽高的最小值来计算时钟的大小,防止窗体拉伸导致的时钟变形以及显示不全

    painter.setPen(Qt::red);   //填充时针,不需要边线所以NoPen
    QString timeStr= QTime::currentTime().toString();     //绘制当前的时间
    painter.drawText(-40308030Qt::AlignHCenter | Qt::AlignTop timeStr);

    painter.setPen(Qt::NoPen);   //填充时针,不需要边线所以NoPen
    painter.setBrush(hourColor);  //画刷颜色设定
    painter.save();  //保存painter的状态,保存的是当前的坐标状态,如果不保存,画完之后坐标以改变不方便画下一个
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); //将painter(的”视角“)根据时间参数转移(30° * (小时 + 分钟 / 60))
    painter.drawConvexPolygon(hourHand 3);  //填充时针的区域
    painter.restore();

    painter.setPen(hourColor);    //下面画表示小时的刻度,此时要用到画笔(因为要划线)
    for (int i = 0; i < 12; ++i) {
        painter.drawLine(0 -88 0 -96);     //写上刻度数字
        if (i == 0)  painter.drawText(-10-882020Qt::AlignHCenter | Qt::AlignTopQString::number(12));
        else  painter.drawText(-10-882020Qt::AlignHCenter | Qt::AlignTopQString::number(i));
        painter.rotate(30.0);
    }
    //后面的跟前面的类似,分别绘制了分针和秒针,及相应的刻度
    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);
    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));  //设旋转(角度 = 6° * (分钟 + 秒 / 60))
    painter.drawConvexPolygon(minuteHand 3);  //填充分针部分
    painter.restore();

    painter.setPen(minuteColor);
    for (int j = 0; j < 60; ++j) {  //循环60次,绘制表盘(其实可以从1开始,到59,提高一点效率)
        if ((j % 5) != 0)           //判断是否能被5整除(能被5整除表示是正点刻度,暂不绘制)
            painter.drawLine(0 -92 0 -96);  //不是正点刻度,绘制长4个像素的直线
        painter.rotate(6.0);   //循

评论

共有 条评论