QDemo - Analog clock模拟时钟学习并改进

调用函数setRenderHint(QPainter::Antialiasing,true),使绘制时边缘平滑,使用颜色浓度的变化,把图形的边缘转换为象素时引起的扭曲变形尽可能减少,在支持这一功能的平台或者绘图设备上得到一个平滑的边缘。

QTimer类提供了定时器信号和单触发定时器。

它在内部使用定时器事件来提供更通用的定时器。QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

我们可以随时使用save()函数来保存QPainter的状态,并且用restore()函数来使他们回退。

源代码以及解释



1

2

3

4

5

6

7

8

9

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    Widget w;

    w.show();

    return a.exec();

}


main.cpp文件没啥好解释的



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

    Q_OBJECT

public:

    explicit Widget(QWidget *parent = 0);

    ~Widget();

protected:

    void paintEvent(QPaintEvent *e);

private:

    Ui::Widget *ui;

};

#endif // WIDGET_H


widget.h文件,这里用的是ui界面文件,而不是纯代码创建。但主要的绘制工作还是在paintEvent.

// //////yiniao颜色用cos

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

#include "widget.h"

#include "ui_widget.h"

#include <QtGui>

#include <QTime>

#include <QDebug>

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    //一秒更新一次,repaint

    QTimer *timer = new QTimer(this);

    connect(timer,SIGNAL(timeout()),this,SLOT(repaint()));

    timer->start(1000);

    this->setWindowTitle(tr("Clock"));

    this->resize(400,400);

}

Widget::~Widget()

{

    delete ui;

}

void Widget::paintEvent(QPaintEvent *e)

{

//时分秒指针颜色

    QColor hourColor(127,0,127);

    QColor minuteColor(0,127,127,191);

    QColor secColor(Qt::black);

    int side = qMin(this->width(), this->height());

    QTime time = QTime::currentTime();

//正式开始绘画

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);//无锯齿

    painter.translate(this->width()/2, this->height()/2);//将坐标系原点移动到正中心

    painter.scale(side/200.0, side/200.0);//

    painter.setPen(Qt::NoPen);

    painter.setBrush(QBrush(hourColor));//绘制特殊图形,用brush

    painter.save();//保存当前painter状态

    painter.rotate(30.0 * (time.hour() + time.minute()/60.0));//坐标系旋转,根据真实时间确定旋转角度

    static const QPoint hourHand[3] = {

        QPoint(7,8),

        QPoint(-7,8),

        QPoint(0,-40)

    };//

    painter.drawConvexPolygon(hourHand, 3);  //画不规则多边形

    painter.restore();//恢复save前原来的坐标系

    painter.setPen(hourColor);//画刻度线,用Pen,不用Brush

    for(int i=0; i<12; i++){

        painter.drawLine(88,0,96,0);//12小时对应的刻度

        painter.rotate(30.0);

    }

//画1-12数字,根据数学半径sin,cos计算所画text的位置

    int textR = 80;     //big ridaus

    int textW = 12;   //width = height

    int textH = 8;

    const double pi = 3.1415926;

    for(int i=0; i<12; i++){

        double angle = 30.0 * i * pi/ 180;

        int x = textR * cos(angle) - textW/2;

        int y = textR * sin(angle) - textH/2;

        //qDebug()<<i<<angle<<x<<y;

        painter.drawText(QRect(x, y, textW, textH), Qt::AlignCenter,

                         QString("%1").arg((i+3)>12?(i+3-12):(i+3)));

    }

//画分,同上

    painter.setPen(Qt::NoPen);

    painter.setBrush(QBrush(minuteColor));

    painter.save();

    painter.rotate(6.0 * (time.minute() + time.second()/60.0));

    static const QPoint minuteHand[3] = {

        QPoint(7,8),

        QPoint(-7,8),

        QPoint(0,-70)

    };

    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);

    }

//画秒,同上

    painter.setPen(Qt::NoPen);

    painter.setBrush(QBrush(secColor));

    painter.save();

    painter.rotate(time.second() * 6.0);

    static const QPoint secHand[3] = {

        QPoint(3,4),

        QPoint(-3,4),

        QPoint(0,-85)

    };

    painter.drawConvexPolygon(secHand, 3);

    painter.restore();

}


时间: 2024-10-14 14:31:32

QDemo - Analog clock模拟时钟学习并改进的相关文章

WinForm学习 --简单的模拟时钟程序

今天学习GDI+,试着想写一个模拟时钟的小程序,原以为很简单实现:但其实还有些复杂,特别是利用三角函数的那部分,让我四处找资料恶补了一下高中数学才算弄清楚,现在就回顾一下这个程序吧. 程序的目的是要模拟出时钟的效果,那首先就是要画出这个时钟的样子.不考虑美观,一个时钟最简单的组成是一个圆形的表盘,三根直线代表的时针.分针和秒针. <img缺失> 看起来很简单吧,但要怎么样画呢?让我们一步一步来吧: 1.画表盘 Graphics g = this.CreateGraphics(); //创建一个

Qt之模拟时钟

简述 Qt自带的示例中有一个是关于时钟,演示了如何用QPainter的转换和缩放特性来简化绘制自定义部件. 其中主要包含了时针.分针的绘制,并不包含秒针.下面,我们在原示例的基础上进行扩展. 简述 实现方式 示例 效果 源码 更多参考 实现方式 由于时钟是妙级更新的,所以我们需要定时刷新,时钟则使用之前讲过的QPainter 2D图形来进行绘制. 使用QTimer定时刷新,设置超时时间为1000毫秒(1秒). 绘制时钟,通过paintEvent()实现,包括:时针.分针.秒针.及面板.表盘等.

模拟电路学习入门的建议(综合整理)

转载自:http://bbs.eetop.cn/viewthread.php?tid=170164 ”模拟电路学习入门“ "如何才算学好模电,数电"一帖引来大家的关注.这里把各位DX的意见整理了一下,便于大家参考.真正掌握一门技术不容易,大家从不同的侧面和经验谈谈自己的体会,对从事这行业的工程师会有点启迪. 找些實用線路集錦或電子製作書看看,有感興趣的就找找理論資料,然後動手練練,很快就是門內漢(or女)了! 先看基本书,再动手练习练习 Razav 如果有耐心看大头英文最好,翻译也很不

WPF模拟时钟制作

近日因为项目需求,所以才花了一个晚上的时间来学习和制作WPF模拟时钟.本想着参考网上的WPF模拟时钟控件,但多数过于简单.也有一些模拟时钟确实制作的非常精美,但使用了GDI+技术,而非我需要的WPF时钟控件.好了,下面给出我制作的WPF模拟时钟的运行截图吧: 色彩方面只是用了黑色,白色,蓝色等鲜明的颜色,看起来没有特别绚丽,当然,如果需要,可以设置成需要的绚丽的颜色等. 以下是该模拟时钟的XAML代码部分: 1 <Window x:Class="AnalogClockProject.Mai

WIN32下的模拟时钟

#include <Windows.h> #include <math.h> #include <tchar.h> #include "resource.h" #define PI 3.1415926 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI W

模拟时钟

1 #include <Windows.h> 2 #include <tchar.h> 3 #include <math.h> 4 typedef struct Time 5 { 6 int hour, min, sec; 7 }TimeStructure; 8 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow); 9 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM

JS模拟时钟

<html> <head> <title>js模拟时钟</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body onLoad="setInterval(setTimeSpan,1000);"> <span style="fon

模拟时钟(AnalogClock)和数字时钟(DigitalClock)

Demo2\clock_demo\src\main\res\layout\activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 and

纯js+html+css实现模拟时钟

前几天没事写的个模拟时钟,代码仅供小白参考,大神请自动绕过. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>模拟时钟</title> 6 <style> 7 body { 8 margin: 0; 9 padding: 0; 10 } 11 12 #blockDial {