QT菜鸟入门第三弹:模拟时钟例程

<

div id=”content” contentScore=”246″>根据这里的讲解,我们开始进行稍微复杂一些的程序的编写了。

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

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

不多说先,直接贴代码。

  1. #include   
  2. #include”analogclock.h”   
  3. /* 包含头文件 */  
  4. int main(int argc, char *argv[])   
  5. {   
  6.     QApplication app(argc, argv);   
  7.     /* 定义一个类的实例 */  
  8.     AnalogClock clock;   
  9.     /* 显示这个实例 */  
  10.     clock.show();   
  11.     return app.exec();   
  12. }  
 
  1. #ifndef ANALOGCLOCK_H   
  2. #define ANALOGCLOCK_H   
  3. #include   
  4. /* 创建了一个类,用公有的派生类型,从QWidget派生来的 */  
  5. class AnalogClock:public QWidget   
  6. {   
  7.     Q_OBJECT   
  8. public:   
  9.     /* 构造函数 */  
  10.     AnalogClock(QWidget *parent = 0);   
  11. protected:   
  12.     /* 号称是覆盖掉了原来Widget中的这个函数,重新实现了功能 */  
  13.     void paintEvent(QPaintEvent *event);   
  14. };   
  15. #endif // ANALOGCLOCK_H  
 
  1. #include   
  2. #include “analogclock.h”   
  3. /* 构造函数的实现,当创建新的对象的时候就会调用构造函数 */  
  4. AnalogClock::AnalogClock(QWidget *parent):QWidget(parent)   
  5. {   
  6.     /* 建造一个定时器 */  
  7.     QTimer *timer = new QTimer(this);   
  8.     /* 把定时器的超时中断连接到这个类的更新动作上 */  
  9.     connect(timer, SIGNAL(timeout()),this,SLOT(update()));   
  10.     /* 设置定时器的属性 */  
  11.     timer->start(1000);   
  12.     setWindowTitle(tr(“Analog Clock”));   
  13.     resize(200, 200);   
  14. }   
  15.   
  16. /* paintEvent事件实现函数,触发条件为需要重绘的时候,  
  17.    比如从被遮挡到需要显示,或者被调用update的时候 */  
  18. void AnalogClock::paintEvent(QPaintEvent *)   
  19. {   
  20.     /* 时针和分针的点坐标 */  
  21.     static const QPoint hourHand[3] = {   
  22.         QPoint(7, 8),   
  23.         QPoint(-7, 8),   
  24.         QPoint(0, -40)   
  25.     };   
  26.     static const QPoint minuteHand[3] = {   
  27.         QPoint(7, 8),   
  28.         QPoint(-7, 8),   
  29.         QPoint(0, -70)   
  30.     };   
  31.     /* 设置时针和分针的颜色 */  
  32.     QColor hourColor(127, 0, 127);   
  33.     QColor minuteColor(0, 127, 127, 191);   
  34.     /* QT自带函数,返回两个数的最小值 */  
  35.     int side = qMin(width(), height());   
  36.     /* 获取当前时间 */  
  37.     QTime time = QTime::currentTime();   
  38.     /*  
  39.         在this这个可绘画设备上创建一个绘画者  
  40.         设置渲染,用反锯齿效果  
  41.         用一个重载函数转换一下坐标系  
  42.         缩放一下这个坐标系  
  43.     */  
  44.     QPainter painter(this);   
  45.     painter.setRenderHint(QPainter::Antialiasing);   
  46.     painter.translate(width()/2, height()/2);   
  47.     painter.scale(side/200.0, side/200.0);   
  48.     /* 用一个重载函数设置一下画笔的类型,NoPen就是没有线  
  49.        再用一个重载函数设置一下笔刷的颜色,用默认类型  
  50.     */  
  51.     painter.setPen(Qt::NoPen);   
  52.     painter.setBrush(hourColor);   
  53.     painter.save(); //保存当前的绘画者状态   
  54.     //用给出的角度旋转坐标系   
  55.     painter.rotate(30.0*((time.hour()+time.minute()/60.0)));   
  56.     //用线把点连起来   
  57.     painter.drawConvexPolygon(hourHand, 3);   
  58.     //恢复当前的绘画者状态   
  59.     painter.restore();   
  60.     painter.setPen(hourColor);   
  61.     /* 画代表小时的线 */  
  62.     for (int i = 0; i < 12; ++i) {   
  63.         painter.drawLine(88, 0, 96, 0);   
  64.         painter.rotate(30.0);   
  65.     }   
  66.     //下面画分钟的过程是上面的重复,只是分针的颜色用到了透明度   
  67.     painter.setPen(Qt::NoPen);   
  68.     painter.setBrush(minuteColor);   
  69.     painter.save();   
  70.     painter.rotate(6.0*(time.minute()+time.second()/60.0));   
  71.     painter.drawConvexPolygon(minuteHand, 3);   
  72.     painter.restore();   
  73.     painter.setPen(minuteColor);   
  74.     /* 画代表分钟的线 */  
  75.     for (int j = 0; j < 60; ++j) {   
  76.         if((j % 5) != 0) {   
  77.             painter.drawLine(92, 0, 96,0);   
  78.