Qpainter画时钟
来源:互联网 发布:数据网关 编辑:程序博客网 时间:2024/04/28 16:33
根据以下文章整理的时钟界面的代码
Qt浅谈之二:钟表(时分秒针)
http://blog.csdn.net/taiyang1987912/article/details/30272105
下面贴下整理后的代码
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_updateTime = new QTimer(this);
connect(m_updateTime,SIGNAL(timeout()),this,SLOT(update())); //每隔1s刷新一次界面
m_updateTime->start(1000);
}
void MainWindow::paintEvent(QPaintEvent*event)
{
//下面三个数组用来定义表针的三个顶点,以便后面的填充
static const QPoint hourHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -40)
};
static const QPoint minuteHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -70)
};
static const QPoint secondHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -90)
};//秒针
QTime time = QTime::currentTime(); //获取当前的时间
//填充表针的颜色
QColor hourColor(127, 0, 127); //分针颜色(第四个表示不透明度)
QColor minuteColor(0, 127, 127, 191);
QColor secondColor(127, 127, 0, 127);
QPainter painter(this); //声明用来绘图用的painter
painter.setRenderHint(QPainter::Antialiasing);//绘制的图像反锯齿
painter.translate(width() / 2, height() / 2);//重新定位坐标起始点,把坐标原点放到窗体的中央
painter.setPen(Qt::NoPen); //填充时针,不需要边线所以NoPen
painter.setBrush(hourColor); //画刷颜色设定
painter.save(); //保存painter的状态,保存的是当前的坐标状态,如果不保存,画完之后坐标以改变不方便画下一个
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); //将painter(的”视角“)根据时间参数转移(30° * (小时 + 分钟 / 60))
painter.drawConvexPolygon(hourHand, 3); //填充时针的区域
painter.restore();
//后面的跟前面的类似,分别绘制了分针和秒针,及相应的刻度
painter.setPen(Qt::NoPen);
painter.setBrush(minuteColor);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); //设旋转(角度 = 6° * (分钟 + 秒 / 60))
painter.drawConvexPolygon(minuteHand, 3); //填充分针部分
painter.restore();
painter.setPen(Qt::NoPen);
painter.setBrush(secondColor);
painter.save();
painter.rotate(6.0 * time.second()); //设置旋转(6° * 秒)
painter.drawConvexPolygon(secondHand, 3); //设置填充
painter.restore();
painter.setPen(minuteColor);
for (int j = 0; j < 60; ++j) { //循环60次,绘制表盘(其实可以从1开始,到59,提高一点效率)
if ((j % 5) != 0) //判断是否能被5整除(能被5整除表示是正点刻度,暂不绘制)
painter.drawLine(0, -92, 0, -96); //不是正点刻度,绘制长4个像素的直线
painter.rotate(6.0); //循环60次,每次旋转6度,所以不用save和restore
}
painter.setPen(hourColor); //下面画表示小时的刻度,此时要用到画笔(因为要划线)
for (int i = 0; i < 12; ++i) {
painter.drawLine(0, -88, 0, -96); //写上刻度数字
if (i == 0) painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(12));
else painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i));
painter.rotate(30.0);
}
painter.setBrush(Qt::black);
painter.drawEllipse(QPoint(0,0),2,2);
painter.setBrush(Qt::NoBrush);
painter.setPen(Qt::black);
painter.drawEllipse(QPoint(0,0),97,97);
}
效果图:
0 0
- Qpainter画时钟
- QPainter 画扇形
- QPainter
- QPainter
- QPainter
- QPainter
- QPainter
- QPainter
- QPainter
- QPainter的使用(画国旗)
- Qt之QPainter 画一个4*4棋盘
- Qt---用QPainter画一个3D的正方体
- QPainter画图
- QPainter-24
- QPainter-25
- QPainter Class
- QString QPainter
- QPainter基础
- volley源码的简单分析(1)
- java集合类之集合类接口实现的类
- Treadlocal的实现转账思想解读MVC
- 定时拉取ElasticSearch数据
- mvel2.0语法指南
- Qpainter画时钟
- 9.26 RSorder offer 80% off oldschool runescape gold for The Fairy Rings
- 数据库的读写分离
- Markdown文档中的UML
- 编译程序遇到问题 relocation R_X86_64_32 against `.rodata' can not be used when making a shared object;
- 接口与抽象类的区别
- Swift NSUserDefaults
- python中创建临时文件夹
- RabbitMQ 与SpringMvc的配置使用