工程代码: clock.rar
一个模拟时钟,界面
建立的类基于 QWidget类
class Clock : public QWidget
- protected:
-
void paintEvent(QPaintEvent *); //重绘 事件
-
/*返回建议的窗口部件大小。详细情况请参考“sizeHint”属性。
-
QSize sizeHint
-
这个属性保存的是建议的窗口部件大小。
-
如果这个属性值是无效的大小,那么就没有大小被建议。
-
如果这个窗口部件没有布局,sizeHint()的默认实现返回一个无效大小,并且否则的话就返回布局的首选大小。
-
*/
-
QSize sizeHint() const{return QSize(400,400);}
-
-
private:
-
void drawClock(QPainter *painter); //画 边框
-
void drawHourHand(QPainter *painter);//绘制 小时 针形状
-
void drawMinuteHand(QPainter *painter);//绘制 分钟 针形状
-
void drawSecondHand(QPainter *painter); //绘制 秒针 针形状
- #ifndef CLOCK_H
-
#define CLOCK_H
-
-
#include <QWidget>
-
#include <QTimer> //定时器
-
#include <QTime> //系统时间
-
#include <QPainter> //画板
-
#include <QSize>
-
-
class Clock : public QWidget
-
{
-
Q_OBJECT //含有信号槽的需要
-
-
public:
-
//explicit 禁止构造函数隐式转换
-
explicit Clock(QWidget *parent = 0);
-
-
protected:
-
void paintEvent(QPaintEvent *); //重绘 事件
-
/*返回建议的窗口部件大小。详细情况请参考“sizeHint”属性。
-
QSize sizeHint
-
这个属性保存的是建议的窗口部件大小。
-
如果这个属性值是无效的大小,那么就没有大小被建议。
-
如果这个窗口部件没有布局,sizeHint()的默认实现返回一个无效大小,并且否则的话就返回布局的首选大小。
-
*/
-
QSize sizeHint() const{return QSize(400,400);}
-
-
private:
-
void drawClock(QPainter *painter); //画 边框
-
void drawHourHand(QPainter *painter);//绘制 小时 针形状
-
void drawMinuteHand(QPainter *painter);
-
void drawSecondHand(QPainter *painter);
-
private:
-
qreal clockRadius;//半径
-
QTimer *secondTimer;// 用于秒 中断 定时器
-
-
};
-
#endif // CLOCK_H
- #include "clock.h"
-
#include <QPointF>
-
-
Clock::Clock(QWidget *parent):QWidget(parent)
-
{
-
secondTimer = new QTimer(this); //创建一个定时器
-
secondTimer->setInterval(1000);//1s 时间
-
-
//将定时器1s中断信号,与 画板 重画 槽函数 联系起来
-
connect(secondTimer,SIGNAL(timeout()),this,SLOT(update()));
-
secondTimer->start();//开始定时器
-
}
-
-
//重绘 函数
-
void Clock::paintEvent(QPaintEvent *)
-
{
-
QPainter painter;
-
/*内联函数 整个窗口的 大小 我们也可以自己定义大小
-
inline int QWidget::width() const
-
{ return data->crect.width(); }
-
*/
-
clockRadius = width() > height() ? height()/2 : width()/2 ;//返回半径大小
-
//整个widget 长宽 我们也可以自己指定大小
-
painter.begin(this); //开始画窗口设备,假如成功,放回 successful
-
painter.setRenderHint(QPainter::Antialiasing,true); //走反样,减少视觉扭曲
-
drawClock(&painter); //画窗口
-
drawHourHand(&painter); //画小时 针形状
-
drawMinuteHand(&painter);//
-
drawSecondHand(&painter);
-
painter.end();
-
}
-
-
/*
-
画边框
-
1. 画边框
-
2. 画外面的大圆
-
3. 画中心点
-
4. 画4个刻度
-
*/
-
void Clock::drawClock(QPainter *painter)
-
{
-
painter->save(); //保存窗口设置
-
-
// 1 画边框
-
// painter->setBrush(QColor(21,21,21));
-
painter->setBrush(Qt::gray);
-
painter->setPen(Qt::NoPen);
-
/*内联inline QRect QWidget::rect() const
-
{ return QRect(0,0,data->crect.width(),data->crect.height()); }
-
*/ painter->drawRect(rect()); //填充 矩形
-
-
// 2 画 大圆
-
QPointF center = rect().center(); //设置中心坐标点
-
QRadialGradient circleGradient(center,clockRadius,center);//设置颜色辐射,中心点 半径 焦点
-
// circleGradient.setColorAt(0.0,QColor(30,30,30));//设置颜色辐射
-
// circleGradient.setColorAt(0.6,QColor(50,50,50));
-
// circleGradient.setColorAt(1.0,QColor(60,60,60));
-
circleGradient.setColorAt(0.0,Qt::white);
-
circleGradient.setColorAt(0.6,Qt::green);
-
circleGradient.setColorAt(1.0,Qt::black);
-
-
painter->setBrush(circleGradient); //设置画刷 颜色 辐射渐变
-
painter->setPen(QPen(Qt::white,2));//
-
painter->drawEllipse(center,clockRadius,clockRadius);//画大圆,中心点,长宽
-
// 3 画 中心点圆
-
painter->setBrush(Qt::white);
-
painter->drawEllipse(center,3,3); //画中心小圆
-
-
painter->restore();// 恢复设置
-
-
painter->save();
-
// 4 画 4 个 刻度
-
painter->setPen(Qt::white);
-
painter->translate(rect().center());//设置原点 在clock中心点
-
-
for(int i = 0; i < 12; i++) //画 12 个 时钟刻度
-
{
-
painter->setPen(Qt::red);
-
painter->setBrush(Qt::red);
-
painter->rotate(30);//顺时针旋转
-
painter->drawLine(QPointF(0,clockRadius),QPointF(0,clockRadius/15*14));//画刻度
-
}
-
-
for(int i = 0; i < 60; i++) //画 60 个 秒钟刻度
-
{
-
painter->setPen(Qt::white);
-
painter->rotate(6);//顺时针旋转
-
painter->drawLine(QPointF(0,clockRadius),QPointF(0,clockRadius/30*29));//画刻度
-
}
-
painter->restore();
-
-
/*
-
循环旋转 每次的位置
-
---------------------------
-
| |
-
| |
-
| |
-
| .(0,0) |
-
| |
-
| |
-
| |
-
| .(0,clockRadius-clockRadius/15)) |
-
|____________._____________|
-
(0,clockRadius)
-
*/
-
}
-
-
/*
-
画小时 针形状
-
*/
-
-
void Clock::drawHourHand(QPainter *painter)
-
{
-
painter->save();//保存以前的坐标
-
-
painter->translate(rect().center());//设置原点 中心点
-
// painter->translate(100,00);这样也可以设置原点,但是没有整个
-
-
painter->setPen(QPen(Qt::white,2));
-
//说明: +180 ,表示从 时钟0刻度开始
-
painter->rotate(180+30.0*(QTime::currentTime().hour()+QTime::currentTime().minute() / 60.0));
-
painter->drawLine(QPointF(0,clockRadius/10*6),QPointF(0,0));
-
-
painter->restore();//恢复以前的坐标
-
}
-
-
void Clock::drawMinuteHand(QPainter *painter)
-
{
-
painter->save();// 保存坐标
-
-
painter->translate(rect().center());//设置中心点/原点
-
painter->setPen(QPen(Qt::white,2));
-
//说明: +180 ,表示从 时钟0刻度开始
-
painter->rotate(180+6.0*(QTime::currentTime().minute() + QTime::currentTime().second() / 60.0));
-
painter->drawLine(QPointF(0,clockRadius/10*8),QPointF(0,0));
-
-
painter->restore();//恢复坐标
-
}
-
-
void Clock::drawSecondHand(QPainter *painter)
-
{
-
painter->save();
-
painter->translate(rect().center());
-
painter->setPen(QPen(Qt::white,2));
-
painter->rotate(180+6.0*QTime::currentTime().second());
-
painter->drawLine(QPointF(0,clockRadius/10*9),QPointF(0,0));
-
painter->restore();
-
}
- #include <QApplication>
-
#include "clock.h"
-
-
int main(int argc, char *argv[])
-
{
-
QApplication app(argc,argv);
-
Clock w;
-
// w.resize(300,300);
-
w.show();
-
return app.exec();
-
}
阅读(974) | 评论(0) | 转发(1) |