QT菜鸟入门第三弹:模拟时钟例程
2009 年 6 月 13 日
<
div id=”content” contentScore=”246″>根据这里的讲解,我们开始进行稍微复杂一些的程序的编写了。
这个程序里面我们用到了需要自己编写类来实现一个控件了。
而且这个类还被独立为单独的文件。
不多说先,直接贴代码。
- #include
- #include”analogclock.h”
- /* 包含头文件 */
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- /* 定义一个类的实例 */
- AnalogClock clock;
- /* 显示这个实例 */
- clock.show();
- return app.exec();
- }
- #ifndef ANALOGCLOCK_H
- #define ANALOGCLOCK_H
- #include
- /* 创建了一个类,用公有的派生类型,从QWidget派生来的 */
- class AnalogClock:public QWidget
- {
- Q_OBJECT
- public:
- /* 构造函数 */
- AnalogClock(QWidget *parent = 0);
- protected:
- /* 号称是覆盖掉了原来Widget中的这个函数,重新实现了功能 */
- void paintEvent(QPaintEvent *event);
- };
- #endif // ANALOGCLOCK_H
- #include
- #include “analogclock.h”
- /* 构造函数的实现,当创建新的对象的时候就会调用构造函数 */
- AnalogClock::AnalogClock(QWidget *parent):QWidget(parent)
- {
- /* 建造一个定时器 */
- QTimer *timer = new QTimer(this);
- /* 把定时器的超时中断连接到这个类的更新动作上 */
- connect(timer, SIGNAL(timeout()),this,SLOT(update()));
- /* 设置定时器的属性 */
- timer->start(1000);
- setWindowTitle(tr(“Analog Clock”));
- resize(200, 200);
- }
- /* paintEvent事件实现函数,触发条件为需要重绘的时候,
- 比如从被遮挡到需要显示,或者被调用update的时候 */
- void AnalogClock::paintEvent(QPaintEvent *)
- {
- /* 时针和分针的点坐标 */
- static const QPoint hourHand[3] = {
- QPoint(7, 8),
- QPoint(-7, 8),
- QPoint(0, -40)
- };
- static const QPoint minuteHand[3] = {
- QPoint(7, 8),
- QPoint(-7, 8),
- QPoint(0, -70)
- };
- /* 设置时针和分针的颜色 */
- QColor hourColor(127, 0, 127);
- QColor minuteColor(0, 127, 127, 191);
- /* QT自带函数,返回两个数的最小值 */
- int side = qMin(width(), height());
- /* 获取当前时间 */
- QTime time = QTime::currentTime();
- /*
- 在this这个可绘画设备上创建一个绘画者
- 设置渲染,用反锯齿效果
- 用一个重载函数转换一下坐标系
- 缩放一下这个坐标系
- */
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- painter.translate(width()/2, height()/2);
- painter.scale(side/200.0, side/200.0);
- /* 用一个重载函数设置一下画笔的类型,NoPen就是没有线
- 再用一个重载函数设置一下笔刷的颜色,用默认类型
- */
- painter.setPen(Qt::NoPen);
- painter.setBrush(hourColor);
- painter.save(); //保存当前的绘画者状态
- //用给出的角度旋转坐标系
- painter.rotate(30.0*((time.hour()+time.minute()/60.0)));
- //用线把点连起来
- painter.drawConvexPolygon(hourHand, 3);
- //恢复当前的绘画者状态
- painter.restore();
- painter.setPen(hourColor);
- /* 画代表小时的线 */
- for (int i = 0; i < 12; ++i) {
- painter.drawLine(88, 0, 96, 0);
- painter.rotate(30.0);
- }
- //下面画分钟的过程是上面的重复,只是分针的颜色用到了透明度
- painter.setPen(Qt::NoPen);
- painter.setBrush(minuteColor);
- painter.save();
- painter.rotate(6.0*(time.minute()+time.second()/60.0));
- 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);