模拟时钟的程序中用到了6个我们新接触的东西:
1. QPaintEvent 绘画事件
2. QTimer 定时器
3. QPoint 点
4. QColor 颜色
5. QTime 时间
6. QPainter 绘画者
下面我们针对每一个分别作出粗浅的理解解释分析……
QPaintEvent
QPaintEvent是个类,继承于QEvent,包含了绘画的事件。
当控件本身更新的时候,绘画事件会发送到控件,对于实例来讲,这种事情一般是遮住他的控件移动了,导致其需要重绘。
事件包含了一个region()需要更新,还有一一个rect(),rect是这个区域的边框。这两个都是需要提供的,因为许多控件不能使用region,这样的话rect就比rgion().boudingRect()更快了。
下面提到了自动剪切的事情
在一个paint event过程中,绘画被剪切到region()中。Qt的绘画系统执行剪切,并且独立于任何一个可能应用于QPainter用来在绘画设备上进行绘画的剪切。
结果就是由QPainter::clipRegion()返回给新构建的QPainter的值不会影响到绘画系统使用的剪切区域
QTimer
QTimer是个类,提供了重复的和一次性的定时器
QTimer类为定时器提供了一个高层编程接口。使用它的时候,创建一个QTimer,连接它的timeout()信号到适当的槽上,然后调用start(),然后它就会按照不变的间隔区触发timerout()信号。模拟时钟上的例子:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
然后update()槽每秒被触发一次。
我们也可以设置定时器让它只被触发一次,调用setSingleShot(true).也可以使用静态的QTimer::SingleShot()函数来调用一个槽,在指定一个间隔之后:
QTimer::singleShot(200, this, SLOT(updateCaption()));
在多线程程序中,你可以使用QTimer在任一个具有事件循环的线程中。为了在非GUI的线程中开始一个事件循环,可以使用QThread::exec(),QT使用定时器的线程亲和力(thread affinity)来检测哪个线程需要触发timeout()信号。因为如此,你必须在一个线程里开始,结束定时器;它不能在另外的线程中开始一个定时器。
作为一个特殊的例子,一个QTimer用一个值为0的timeout将会马上time out,在窗口系统时间队列中被处理的所有事件。这可以用来做很繁重的工作,当提供一个很短暂的用户界面的时候:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timerout()), this, SLOT(processOneThing()));
timer->start();
processOneThing()将会从此以后被重复的调用。它应给能够快速的返回,以便Qt可以处理分配事件给控件并且当它完成工作的时候马上停掉定时器。这是在GUI应用程序中实现大量工作的一种传统解决方式;多线程现在许多平台上都使用了,我们期望零毫秒QTimer逐步的能被QThread替代掉。
下面的帮助文档还讲到了精度以及它的替代函数,这里就不慢慢翻译了。
QPoint
QPoint是一个类,定义了一个点,用整数。
一个点指定了x坐标和y坐标,可以通过x(),y()函数来访问。isNull()函数返回真值,当x,y都为0的时候。坐标可以通过set(),setY()函数设置,或者rx(),ry()函数将会返回坐标系的引用。(允许直接修改)
给出一个点p,下面的语句是等价的
QPoint p;
p.setX(p.x() + 1);
p += QPoint(1,0)
p.rx()++;
一个QPoint对象也可以被用作一个向量:加减都定义为向量运算。也可以被int或qreal进行乘除。
另外,QPoint类提供了manhattanLength()函数,这个曼哈顿函数返回两数的平方和的平方根。
最后QPoint对象可以像流一样的被比较。
QColor
QColor是一个类,提供颜色,基于RGB,HSV或者CMYK的值。
颜色系统就不解释了,东西太复杂了,QColor构造函数是基于RGB的,要转换成其他的颜色制式,用toHsv()或者toCmyk()函数。
QTime
QTime是一个类,提供时钟时间。
QTime对象包含一个时钟,比如时分秒毫秒等。它可以从当前i同事中读取当前时间,测量一段时间。它还提供了比较时间的函数,通过添加毫秒更改时间的函数。
QTime使用24小时制的时间格式,没有上午下午的概念。不想QDateTime,QTime不知道时区或者DST时间。DST是daylight savings time 就是夏时制,改作息时间用的。
QTime对象一般通过给出的时分秒毫秒来创建,或者使用静态函数currentTime(),创建一个QTime对象,包含了系统本地时间。注意,精度取决于系统,不是所有的系统都提供1毫秒的精度。
hour(),minute(),second()和msec()函数用来访问时间的时分秒毫秒。同样的信息由toString()函数提供文本格式。
QTime提供了全部的操作来比较两个QTime对象。一个早一些的时间被认为是小的。
addSecs(),addMSecs()函数可以使用。于此对应的两个时间之间可以用secsTo(),mescsTo()。
QTime可以用来测量时间间隔,使用start(),restart(),elapsed()函数。
QPainter
QPainter是一个类,提供了底层的在控件或者其他可绘制设备上的绘画能力。