Chinaunix首页 | 论坛 | 博客
  • 博客访问: 977498
  • 博文数量: 145
  • 博客积分: 1302
  • 博客等级: 中尉
  • 技术积分: 1778
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-07 16:00
文章分类

全部博文(145)

文章存档

2018年(1)

2016年(1)

2015年(6)

2014年(4)

2013年(59)

2012年(32)

2011年(36)

2009年(1)

2007年(2)

2006年(3)

分类: LINUX

2013-02-28 14:01:37

模拟时钟,这个是Linux老师布置的作业Linux下用QT框架,使用C++编写模拟时钟,我从网上搜了大部分都是同一个代码,我这里大部分使用网上搜到的代码,只把坐标那部分再说详细点。最后附上代码,有兴趣的下下去看,我这里只解释部分。

 

源文件:(clock.cpp)

1.  #include 
2.  #include 
3.  #include 
4.  #include "clock.h"
5.  Clock::Clock(QWidget *parent): QWidget(parent)
6.  {
7.      QTimer *timer = new QTimer(this);//声明一个定时器
8.      connect(timer, SIGNAL(timeout()), this, SLOT(update()));//连接信号槽,定时器超时触发窗体更新
9.      timer->start(1000);//启动定时器
10.    setWindowTitle(tr("Clock"));//设置窗体名称
11.    resize(200, 200);//设置窗体大小
12.}
13.void Clock::paintEvent(QPaintEvent *)
14.{
15.    //下面三个数组用来定义表针的三个顶点,以便后面的填充
16.    static const QPoint hourHand[3] = {
17.                        QPoint(3, 8),
18.                        QPoint(-3, 8),
19.                        QPoint(0, -40)
20.    };//时针  
QT编写模拟时钟 - Wpggles - Wpggles(f)` BLOG //时针绘制的情况,在QT的坐标中原点是在左上角,向下是y轴的正半轴,向右是x轴的正半轴
 
21.    static const QPoint minuteHand[3] = {
22.                        QPoint(3, 8),
23.                        QPoint(-3, 8),
24.                        QPoint(0, -70)
25.    };//分针
26.    static const QPoint secondHand[3] = {
27.                        QPoint(3, 8),
28.                        QPoint(-3, 8),
29.                        QPoint(0, -90)
30.    };//秒针
31.    //填充表针的颜色
32.    QColor hourColor(127, 0, 127);//时针颜色
33.    QColor minuteColor(0, 127, 127, 191);//分针颜色(第四个表示不透明度)
34.    QColor secondColor(127, 127, 0, 127);//秒针颜色(第四个表示不透明度)
35.    int side = qMin(width(), height());//绘制的范围(宽、高中最小值)
36.    QTime time = QTime::currentTime();//获取当前的时间
37.    QPainter painter(this);//声明用来绘图用的painter
38.    painter.setRenderHint(QPainter::Antialiasing);//绘制的图像反锯齿
39.    painter.translate(width() / 2, height() / 2);//重新定位坐标起始点,把坐标原点放到窗体的中央
40.    painter.scale(side / 200.0, side / 200.0);//设定画布的边界,用窗体宽高的最小值来计算时钟的大小,防止窗体拉伸导致的时钟变形以及显示不全
41.    painter.setPen(Qt::NoPen);//填充时针,不需要边线所以NoPen
42.    painter.setBrush(hourColor);//画刷颜色设定
43.    painter.save();//保存painter的状态,保存的是当前的坐标状态,如果不保存,画完之后坐标以改变不方便画下一个
44.    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));//painter(的视角)根据时间参数转移(30° * (小时 + 分钟 / 60))
45.    painter.drawConvexPolygon(hourHand, 3);//填充时针的区域
46.    painter.restore();//恢复填充前画家的状态,恢复保存前的坐标状态,方便下一个图形的绘制
47.    painter.setPen(hourColor);//下面画表示小时的刻度,此时要用到画笔(因为要划线)
48.    for (int i = 0; i < 12; ++i) //十二个刻度,循环下就好了
49.    {
50.        painter.drawLine(88, 0, 96, 0);//没次都是这样,先画跳线,再转个角
51.        painter.rotate(30.0);//旋转30度继续画
52.    }
53.    //后面的跟前面的类似,分别绘制了分针和秒针,及相应的刻度
54.    painter.setPen(Qt::NoPen);//填充分针,不需要边线所以NoPen
55.    painter.setBrush(minuteColor);//设置画刷颜色
56.    painter.save();//保存当前状态
57.    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));//设旋转(角度 =  * (分钟 +  / 60))
58.    painter.drawConvexPolygon(minuteHand, 3);//填充分针部分
59.    painter.restore();//恢复保存前状态
60.    painter.setPen(minuteColor);//设置画刷颜色
61.    for (int j = 0; j < 60; ++j) //循环60次,绘制表盘(其实可以从1开始,到59,提高一点效率)
62.    {
63.        if ((j % 5) != 0)//判断是否能被5整除(能被5整除表示是正点刻度,暂不绘制)
64.        {
65.            painter.drawLine(92, 0, 96, 0);//不是正点刻度,绘制长4个像素的直线
66.         }
67.        painter.rotate(6.0);//旋转六度
68.    }//循环60次,每次旋转6度,所以不用saverestore
69.    painter.setPen(Qt::NoPen);//填充分针,不需要边线所以NoPen
70.    painter.setBrush(secondColor);//设置画刷颜色
71.    painter.save();//保存当前状态
72.    painter.rotate(6.0 * time.second());//设置旋转(6° * )
73.    painter.drawConvexPolygon(secondHand, 3);//设置填充
74.    painter.restore();//恢复保存前状态
75.    //painter.end();//释放掉图形所占存储空间,因为我们要不停的绘制,所以不释放掉空间,否则每次都申请空间很耗资源
76.} 
阅读(3645) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~