Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4235284
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-07-25 11:19:51

工程代码:  clock.rar  

一个模拟时钟,界面

建立的类基于 QWidget类

class Clock : public QWidget

  1. protected:
  2.     void paintEvent(QPaintEvent *); //重绘 事件
  3. /*返回建议的窗口部件大小。详细情况请参考“sizeHint”属性。
  4. QSize sizeHint
  5. 这个属性保存的是建议的窗口部件大小
  6. 如果这个属性值是无效的大小,那么就没有大小被建议。
  7. 如果这个窗口部件没有布局,sizeHint()的默认实现返回一个无效大小,并且否则的话就返回布局的首选大小
  8. */
  9.     QSize sizeHint() const{return QSize(400,400);}

  10. private:
  11.     void drawClock(QPainter *painter); //画 边框
  12.    void drawHourHand(QPainter *painter);//绘制 小时 针形状
  13.    void drawMinuteHand(QPainter *painter);//绘制 分钟 针形状
  14.    void drawSecondHand(QPainter *painter); //绘制 秒针 针形状

  1. #ifndef CLOCK_H
  2. #define CLOCK_H

  3. #include <QWidget>
  4. #include <QTimer> //定时器
  5. #include <QTime> //系统时间
  6. #include <QPainter> //画板
  7. #include <QSize>

  8. class Clock : public QWidget
  9. {
  10.     Q_OBJECT //含有信号槽的需要

  11. public:
  12.     //explicit 禁止构造函数隐式转换
  13.     explicit Clock(QWidget *parent = 0);

  14. protected:
  15.     void paintEvent(QPaintEvent *); //重绘 事件
  16. /*返回建议的窗口部件大小。详细情况请参考“sizeHint”属性。
  17. QSize sizeHint
  18. 这个属性保存的是建议的窗口部件大小。
  19. 如果这个属性值是无效的大小,那么就没有大小被建议。
  20. 如果这个窗口部件没有布局,sizeHint()的默认实现返回一个无效大小,并且否则的话就返回布局的首选大小。
  21. */
  22.     QSize sizeHint() const{return QSize(400,400);}

  23. private:
  24.     void drawClock(QPainter *painter); //画 边框
  25.     void drawHourHand(QPainter *painter);//绘制 小时 针形状
  26.     void drawMinuteHand(QPainter *painter);
  27.     void drawSecondHand(QPainter *painter);
  28. private:
  29.     qreal clockRadius;//半径
  30.     QTimer *secondTimer;// 用于秒 中断 定时器

  31. };
  32. #endif // CLOCK_H

  1. #include "clock.h"
  2. #include <QPointF>

  3. Clock::Clock(QWidget *parent):QWidget(parent)
  4. {
  5.     secondTimer = new QTimer(this); //创建一个定时器
  6.     secondTimer->setInterval(1000);//1s 时间

  7.     //将定时器1s中断信号,与 画板 重画 槽函数 联系起来
  8.     connect(secondTimer,SIGNAL(timeout()),this,SLOT(update()));
  9.     secondTimer->start();//开始定时器
  10. }

  11. //重绘 函数
  12. void Clock::paintEvent(QPaintEvent *)
  13. {
  14.     QPainter painter;
  15.     /*内联函数 整个窗口的 大小 我们也可以自己定义大小
  16.     inline int QWidget::width() const
  17.     { return data->crect.width(); }
  18.     */
  19.     clockRadius = width() > height() ? height()/2 : width()/2 ;//返回半径大小
  20.                  //整个widget 长宽 我们也可以自己指定大小
  21.     painter.begin(this); //开始画窗口设备,假如成功,放回 successful
  22.     painter.setRenderHint(QPainter::Antialiasing,true); //走反样,减少视觉扭曲
  23.     drawClock(&painter); //画窗口
  24.     drawHourHand(&painter); //画小时 针形状
  25.     drawMinuteHand(&painter);//
  26.     drawSecondHand(&painter);
  27.     painter.end();
  28. }

  29. /*
  30.     画边框
  31.     1. 画边框
  32.     2. 画外面的大圆
  33.     3. 画中心点
  34.     4. 画4个刻度
  35. */
  36. void Clock::drawClock(QPainter *painter)
  37. {
  38.     painter->save(); //保存窗口设置

  39. // 1 画边框
  40. // painter->setBrush(QColor(21,21,21));
  41.     painter->setBrush(Qt::gray);
  42.     painter->setPen(Qt::NoPen);
  43.     /*内联inline QRect QWidget::rect() const
  44. { return QRect(0,0,data->crect.width(),data->crect.height()); }
  45. */ painter->drawRect(rect()); //填充 矩形

  46. // 2 画 大圆
  47.     QPointF center = rect().center(); //设置中心坐标点
  48.     QRadialGradient circleGradient(center,clockRadius,center);//设置颜色辐射,中心点 半径 焦点
  49.  // circleGradient.setColorAt(0.0,QColor(30,30,30));//设置颜色辐射
  50.  // circleGradient.setColorAt(0.6,QColor(50,50,50));
  51.  // circleGradient.setColorAt(1.0,QColor(60,60,60));
  52.     circleGradient.setColorAt(0.0,Qt::white);
  53.     circleGradient.setColorAt(0.6,Qt::green);
  54.     circleGradient.setColorAt(1.0,Qt::black);

  55.     painter->setBrush(circleGradient); //设置画刷 颜色 辐射渐变
  56.     painter->setPen(QPen(Qt::white,2));//
  57.     painter->drawEllipse(center,clockRadius,clockRadius);//画大圆,中心点,长宽
  58. // 3 画 中心点圆
  59.     painter->setBrush(Qt::white);
  60.     painter->drawEllipse(center,3,3); //画中心小圆

  61.     painter->restore();// 恢复设置

  62.     painter->save();
  63. // 4 画 4 个 刻度
  64.     painter->setPen(Qt::white);
  65.     painter->translate(rect().center());//设置原点 在clock中心点

  66.     for(int i = 0; i < 12; i++) //画 12 个 时钟刻度
  67.     {
  68.         painter->setPen(Qt::red);
  69.         painter->setBrush(Qt::red);
  70.         painter->rotate(30);//顺时针旋转
  71.         painter->drawLine(QPointF(0,clockRadius),QPointF(0,clockRadius/15*14));//画刻度
  72.     }

  73.     for(int i = 0; i < 60; i++) //画 60 个 秒钟刻度
  74.     {
  75.         painter->setPen(Qt::white);
  76.         painter->rotate(6);//顺时针旋转
  77.         painter->drawLine(QPointF(0,clockRadius),QPointF(0,clockRadius/30*29));//画刻度
  78.     }
  79.     painter->restore();

  80. /*
  81.   循环旋转 每次的位置
  82.    ---------------------------
  83.    | |
  84.    | |
  85.    | |
  86.    | .(0,0) |
  87.    | |
  88.    | |
  89.    | |
  90.    | .(0,clockRadius-clockRadius/15)) |
  91.    |____________._____________|
  92.                 (0,clockRadius)
  93. */
  94. }

  95. /*
  96. 画小时 针形状
  97. */

  98. void Clock::drawHourHand(QPainter *painter)
  99. {
  100.     painter->save();//保存以前的坐标

  101.     painter->translate(rect().center());//设置原点 中心点
  102.  // painter->translate(100,00);这样也可以设置原点,但是没有整个

  103.     painter->setPen(QPen(Qt::white,2));
  104.     //说明: +180 ,表示从 时钟0刻度开始
  105.     painter->rotate(180+30.0*(QTime::currentTime().hour()+QTime::currentTime().minute() / 60.0));
  106.     painter->drawLine(QPointF(0,clockRadius/10*6),QPointF(0,0));

  107.     painter->restore();//恢复以前的坐标
  108. }

  109. void Clock::drawMinuteHand(QPainter *painter)
  110. {
  111.     painter->save();// 保存坐标

  112.     painter->translate(rect().center());//设置中心点/原点
  113.     painter->setPen(QPen(Qt::white,2));
  114.    //说明: +180 ,表示从 时钟0刻度开始
  115.     painter->rotate(180+6.0*(QTime::currentTime().minute() + QTime::currentTime().second() / 60.0));
  116.     painter->drawLine(QPointF(0,clockRadius/10*8),QPointF(0,0));

  117.     painter->restore();//恢复坐标
  118. }

  119. void Clock::drawSecondHand(QPainter *painter)
  120. {
  121.     painter->save();
  122.     painter->translate(rect().center());
  123.     painter->setPen(QPen(Qt::white,2));
  124.     painter->rotate(180+6.0*QTime::currentTime().second());
  125.     painter->drawLine(QPointF(0,clockRadius/10*9),QPointF(0,0));
  126.     painter->restore();
  127. }

  1. #include <QApplication>
  2. #include "clock.h"

  3. int main(int argc, char *argv[])
  4. {
  5.     QApplication app(argc,argv);
  6.     Clock w;
  7.  // w.resize(300,300);
  8.     w.show();
  9.     return app.exec();
  10. }







阅读(927) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~