模拟时钟例程

QT菜鸟入门第三弹:模拟时钟例程
分类: QT 2011-03-09 11:42 870人阅读 评论(3) 收藏 举报

根据http://doc.qt.nokia.com/4.7/widgets-analogclock.html这上面的讲解,我们开始进行稍微复杂一些的程序的编写了。

这个程序里面我们用到了需要自己编写类来实现一个控件了。

而且这个类还被独立为单独的文件。

不多说先,直接贴代码。


view plaincopy to clipboardprint?
#include<QApplication>   
#include"analogclock.h"   
/* 包含头文件 */  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
    /* 定义一个类的实例 */  
    AnalogClock clock;  
    /* 显示这个实例 */  
    clock.show();  
    return app.exec();  
}  
#include<QApplication> #include"analogclock.h" /* 包含头文件 */ int main(int argc, char *argv[]) { QApplication app(argc, argv); /* 定义一个类的实例 */ AnalogClock clock; /* 显示这个实例 */ clock.show(); return app.exec(); }  

 


view plaincopy to clipboardprint?
#ifndef ANALOGCLOCK_H   
#define ANALOGCLOCK_H   
#include<QWidget>   
/* 创建了一个类,用公有的派生类型,从QWidget派生来的 */  
class AnalogClock:public QWidget  
{  
    Q_OBJECT  
public:  
    /* 构造函数 */  
    AnalogClock(QWidget *parent = 0);  
protected:  
    /* 号称是覆盖掉了原来Widget中的这个函数,重新实现了功能 */  
    void paintEvent(QPaintEvent *event);  
};  
#endif // ANALOGCLOCK_H  
#ifndef ANALOGCLOCK_H #define ANALOGCLOCK_H #include<QWidget> /* 创建了一个类,用公有的派生类型,从QWidget派生来的 */ class AnalogClock:public QWidget { Q_OBJECT public: /* 构造函数 */ AnalogClock(QWidget *parent = 0); protected: /* 号称是覆盖掉了原来Widget中的这个函数,重新实现了功能 */ void paintEvent(QPaintEvent *event); }; #endif // ANALOGCLOCK_H  

 


view plaincopy to clipboardprint?
#include<QtGui>   
#include "analogclock.h"   
/* 构造函数的实现,当创建新的对象的时候就会调用构造函数 */  
AnalogClock::AnalogClock(QWidget *parent):QWidget(parent)  
{  
    /* 建造一个定时器 */  
    QTimer *timer = new QTimer(this);  
    /* 把定时器的超时中断连接到这个类的更新动作上 */  
    connect(timer, SIGNAL(timeout()),this,SLOT(update()));  
    /* 设置定时器的属性 */  
    timer->start(1000);  
    setWindowTitle(tr("Analog Clock"));  
    resize(200, 200);  
}  
  
/* paintEvent事件实现函数,触发条件为需要重绘的时候, 
   比如从被遮挡到需要显示,或者被调用update的时候 */  
void AnalogClock::paintEvent(QPaintEvent *)  
{  
    /* 时针和分针的点坐标 */  
    static const QPoint hourHand[3] = {  
        QPoint(7, 8),  
        QPoint(-7, 8),  
        QPoint(0, -40)  
    };  
    static const QPoint minuteHand[3] = {  
        QPoint(7, 8),  
        QPoint(-7, 8),  
        QPoint(0, -70)  
    };  
    /* 设置时针和分针的颜色 */  
    QColor hourColor(127, 0, 127);  
    QColor minuteColor(0, 127, 127, 191);  
    /* QT自带函数,返回两个数的最小值 */  
    int side = qMin(width(), height());  
    /* 获取当前时间 */  
    QTime time = QTime::currentTime();  
    /* 
        在this这个可绘画设备上创建一个绘画者 
        设置渲染,用反锯齿效果 
        用一个重载函数转换一下坐标系 
        缩放一下这个坐标系 
    */  
    QPainter painter(this);  
    painter.setRenderHint(QPainter::Antialiasing);  
    painter.translate(width()/2, height()/2);  
    painter.scale(side/200.0, side/200.0);  
    /* 用一个重载函数设置一下画笔的类型,NoPen就是没有线 
       再用一个重载函数设置一下笔刷的颜色,用默认类型 
    */  
    painter.setPen(Qt::NoPen);  
    painter.setBrush(hourColor);  
    painter.save(); //保存当前的绘画者状态   
    //用给出的角度旋转坐标系   
    painter.rotate(30.0*((time.hour()+time.minute()/60.0)));  
    //用线把点连起来   
    painter.drawConvexPolygon(hourHand, 3);  
    //恢复当前的绘画者状态   
    painter.restore();  
    painter.setPen(hourColor);  
    /* 画代表小时的线 */  
    for (int i = 0; i < 12; ++i) {  
        painter.drawLine(88, 0, 96, 0);  
        painter.rotate(30.0);  
    }  
    //下面画分钟的过程是上面的重复,只是分针的颜色用到了透明度   
    painter.setPen(Qt::NoPen);  
    painter.setBrush(minuteColor);  
    painter.save();  
    painter.rotate(6.0*(time.minute()+time.second()/60.0));  
    painter.drawConvexPolygon(minuteHand, 3);  
    painter.restore();  
    painter.setPen(minuteColor);  
    /* 画代表分钟的线 */  
    for (int j = 0; j < 60; ++j) {  
        if((j % 5) != 0) {  
            painter.drawLine(92, 0, 96,0);  
        }  
        painter.rotate(6.0);  
    }  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值