资源简介
这是一个比Qt学习书上例子更精进的Demo,用Qt绘制一个时钟,添加了秒针功能。
代码片段和文件信息
#include “clock.h“
#include
#include
#include
#include
#include
#include
Clock::Clock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this); //声明一个定时器
//update()会自动产生重绘消息,调用paintEvent()
connect(timer SIGNAL(timeout()) this SLOT(update())); //连接信号槽,定时器超时触发窗体更新
timer->start(1000); //启动定时器
setWindowtitle(tr(“My Clock“)); //设置窗体名称
resize(300 300); //设置窗体大小
}
Clock::~Clock()
{
}
void Clock::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)
};//秒针
//填充表针的颜色
QColor hourColor(127 0 127); //分针颜色(第四个表示不透明度)
QColor minuteColor(0 127 127 191);
QColor secondColor(127 127 0 127);
int side = qMin(width() height()); //绘制的范围(宽、高中最小值)
QTime time = QTime::currentTime(); //获取当前的时间
QPainter painter(this); //声明用来绘图用的painter
painter.setRenderHint(QPainter::Antialiasing);//绘制的图像反锯齿
painter.translate(width() / 2 height() / 2);//重新定位坐标起始点,把坐标原点放到窗体的中央
painter.scale(side / 300.0 side / 300.0);//设定画布的边界用窗体宽高的最小值来计算时钟的大小,防止窗体拉伸导致的时钟变形以及显示不全
painter.setPen(Qt::red); //填充时针,不需要边线所以NoPen
QString timeStr= QTime::currentTime().toString(); //绘制当前的时间
painter.drawText(-40308030Qt::AlignHCenter | Qt::AlignTop timeStr);
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(hourColor); //下面画表示小时的刻度,此时要用到画笔(因为要划线)
for (int i = 0; i < 12; ++i) {
painter.drawLine(0 -88 0 -96); //写上刻度数字
if (i == 0) painter.drawText(-10-882020Qt::AlignHCenter | Qt::AlignTopQString::number(12));
else painter.drawText(-10-882020Qt::AlignHCenter | Qt::AlignTopQString::number(i));
painter.rotate(30.0);
}
//后面的跟前面的类似,分别绘制了分针和秒针,及相应的刻度
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(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); //循
- 上一篇:DUILIB加载xm
l界面源码 - 下一篇:马尔科夫模型进行数据预测
相关资源
- 基于Qt和opencv的身份证号码识别系统
- 基于FFmpeg4.0.2的AAC编码器
- Qt写的Windows下屏幕录制程序源码
- QT旅游攻略软件程序源代码
- mp4_play.zip
- ffmpeg+qt的简单播放器
- MyPeppa_Release_V1.0.rar
- 从零开始学习音视频编程技术十二 录
- Qt 日历可显示阴历生宵和时钟基于Q
- 计算机网络打作业实现QQ.zip
- 基于qt实现的简易象棋游戏
- 基于ARM9的远程视频监控系统
- 基于QT的音乐播放器源代码及详细教程
- 有关Qt的二十篇中文论文
- 使用Qt编写的视频监控系统支持Qt4-Q
- 用QT读取Excel文件并将数据在界面上动
- QT使用Cypress FX3 USB库代码
- Qt 多线程连接数据库——数据库
- MQTTv3.1中文版
- mt7628 mqtt功能 放到packet下面就可以使
- Qt编写GIF录屏工具
- Qt实现PDF阅读器
- 使用Qt开发NFC应用.pdf
- MQTT-1.zip
- 海康相机SDK二次开发与Qt混合编程代码
- Qt和百度地图交互
- 第6章:Qtopia Core应用程序设计.ppt
- 基于Qt和mupdf的PDF阅读器
- QT桌面精灵
- 基于Qt5.8+OpenCV3.2的Basler多相机触发开
评论
共有 条评论