分类: QT 2011-03-09 11:42 870人阅读 评论(3) 收藏 举报
根据http://doc.qt.nokia.com/4.7/widgets-analogclock.html这上面的讲解,我们开始进行稍微复杂一些的程序的编写了。
这个程序里面我们用到了需要自己编写类来实现一个控件了。
而且这个类还被独立为单独的文件。
不多说先,直接贴代码。
view plaincopy to clipboardprint?
#include<QApplication>
#include"analogclock.h"
/* 包含头文件 */
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
/* 定义一个类的实例 */
AnalogClock clock;
/* 显示这个实例 */
clock.show();
return app.exec();
}
#include<QApplication> #include"analogclock.h" /* 包含头文件 */ int main(int argc, char *argv[]) { QApplication app(argc, argv); /* 定义一个类的实例 */ AnalogClock clock; /* 显示这个实例 */ clock.show(); return app.exec(); }
view plaincopy to clipboardprint?
#ifndef ANALOGCLOCK_H
#define ANALOGCLOCK_H
#include<QWidget>
/* 创建了一个类,用公有的派生类型,从QWidget派生来的 */
class AnalogClock:public QWidget
{
Q_OBJECT
public:
/* 构造函数 */
AnalogClock(QWidget *parent = 0);
protected:
/* 号称是覆盖掉了原来Widget中的这个函数,重新实现了功能 */
void paintEvent(QPaintEvent *event);
};
#endif // ANALOGCLOCK_H
#ifndef ANALOGCLOCK_H #define ANALOGCLOCK_H #include<QWidget> /* 创建了一个类,用公有的派生类型,从QWidget派生来的 */ class AnalogClock:public QWidget { Q_OBJECT public: /* 构造函数 */ AnalogClock(QWidget *parent = 0); protected: /* 号称是覆盖掉了原来Widget中的这个函数,重新实现了功能 */ void paintEvent(QPaintEvent *event); }; #endif // ANALOGCLOCK_H
view plaincopy to clipboardprint?
#include<QtGui>
#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);
}
painter.rotate(6.0);
}
}