基于Qt秒表设计

这个只是虚拟机下的Dialog中设计的秒表,大家感兴趣的可以根据自己手机的秒表界面来设计,亦或是有别的想法也可以在ui中添加函数,或者是在ui界面自己添加调整。本篇将给除了给出Qt秒表设计例子之外还会为大家提供一些常用函数。

一、Qt绘图系统简介;
Qt的绘图系统允许使用相同的API在屏幕和其它打印设
备上进行绘制。整个绘图系统基于 QPainter,
QPainterDevice和QPaintEngine三个类。。
QPainter用来执行绘制的操作;QPaintDevice则允许
QPainter在其上面进行绘制,也就是QPainter工作的空间;
QPaintEngine提供了画笔(QPainter)在不同的设备上进行
绘制的统一的接口。
Qt 的绘图系统实际上是,使用 QPainter在
QPainterDevice上进行绘制,它们之间使用QPaintEngine进
行通讯(也就是翻译QPainter 的指令)。

二、QPainter类的绘图函数
drawPoint 点drawLine 线
drawRect 矩形drawPath 路径
drawArc 圆弧drawChord 弦
drawPie 扇形drawEllipse 椭圆
drawText 文字
drawRoundRect 圆角矩形
drawImage drawPixmap drawPicture 显示图像
drawPoints,drawLines,drawRects 多个点、多条线、多个矩形

三、几种常用函数效果图:

四、画刷和画笔
QBrush定义了QPainter的填充模式,具有样式、颜色、
渐变以及纹理等属性。画刷的style()定义了填充的样式,使
用Qt::BrushStyle枚举,默认值是Qt::NoBrush,也就是不进
行任何填充。
QPen定义了用于QPainter应该怎样画线或者轮廓线。画
笔具有样式、宽度、画刷、笔帽样式和连接样式等属性。画
笔的样式style()定义了线的样式。画笔宽度width()或widthF()
定义了画笔的宽。注意,不存在宽度为 0 的线,画笔宽度通
常至少是 1 像素。
声明画刷或画笔对象的时候,通常可以先指定颜色,然
后再通过类中的setStyle、setWidth等成员函数设置画刷或画
笔属性。
QPainter对象要使用画刷或画笔,通常是调用setBrush
和setPen成员函数,设置过画刷和画笔的状态将会一直保持。

五、图像处理

Qt提供了4个处理图像的类:QImage、QPixmap、
QBitmap,QPicture,它们有着各自的特点。
QImage优化了I/O操作,可以直接存取操作像素数据。
QPixmap优化了再屏幕上显示图像的性能。
QBitmap从QPixmap继承,只能表示黑白两种颜色。
QPicture是可以记录和重启QPrinter命令的类。
对最简单的图片显示而言,用QImage或QPixmap类比较
常见。显示一副图像,可以在paintEvent函数中如下操作:
QPainter painter(this); // 声明QPainter对象
… // 其他绘图操作
// 声明一个QPixmap对象并初始装载图像文件
QPixmap pm("/home/fish/HDU.png");
painter.drawPixmap((rect().width() - pm.width()) / 2,
(rect().height() - pm.height()) / 2, pm); // 居中显示图像

六、秒表设计例子
1、

.pro文件
#-------------------------------------------------
#
# Project created by QtCreator 2019-12-04T16:50:48
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = qt_clock
TEMPLATE = appSOURCES += main.cpp\dialog.cppHEADERS  += dialog.hFORMS    += dialog.ui

2、头文件:

dialog.h代码;
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QTime>
#include <QMouseEvent>namespace Ui {class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;int state;int nMSCnt;QTime   sTime;QList<int> lstCnt;int idx;QRect   rcBottom;QRect   rcLeft;QRect   rcRight;
private   slots:void    mytimer ( );// QWidget interface
protected:void paintEvent(QPaintEvent *);// QWidget interface
protected:void mousePressEvent(QMouseEvent *);// QWidget interface
protected:void wheelEvent(QWheelEvent *);
};#endif // DIALOG_H

3、源文件

(1)dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QPainter>
#include <QTimer>Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);state = 0;nMSCnt = 0;idx =0;sTime =QTime::currentTime();QTimer*timer =new QTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(mytimer()));timer->start(10);
}Dialog::~Dialog()
{delete ui;
}void Dialog::mytimer()
{if(1==state){update();}
}void Dialog::paintEvent(QPaintEvent *)
{QRect  rc = rect();int size = rc.width() > rc.height() ?  rc.height() : rc.width();QPainter qp(this);qp.setFont(QFont("Arial",size/6));qp.setPen(Qt::black);QString str;int nms;if(state>0){if(1==state)nms = (sTime.msecsTo(QTime::currentTime()) + nMSCnt) / 10;elsenms = nMSCnt / 10;str.sprintf("%02d:%02d.%02d",nms / 6000 , (nms / 100) % 60 , nms % 100);}else {str="00:00.00";}if (lstCnt.empty())qp.drawText(rect(),Qt::AlignCenter,str);else{qp.drawText(rect(),Qt::AlignTop | Qt::AlignHCenter,str);qp.setPen(Qt::gray);qp.setFont(QFont("Arial",size / 10));QRect t = rect();t.translate(0, size / 6 + size / 20);nms -= lstCnt.last() / 10;str.sprintf("%02d:%02d.%02d",nms/6000 , (nms/100)%60 , nms%100);qp.drawText(t,Qt::AlignTop | Qt::AlignHCenter,str);qp.setFont(QFont("Arial",size / 15));qp.setPen(Qt::darkBlue);t.translate(0, size / 6);int i =idx,j;if(i>= lstCnt.size())i = lstCnt.size() - 1;j =i - 4;for(;i>=0 &&i>j;--i){nms = lstCnt[i] / 10;int nnms;if(i>0)nnms = (lstCnt[i] - lstCnt[i-1]) / 10;str.sprintf("%02d      %02d:%02d.%02d      %02d:%02d.%02d",i + 1, nms / 6000,(nms /100) % 60,nms % 100, nnms /6000 ,(nnms /100)%60,nnms % 100);qp.drawText(t,Qt::AlignTop | Qt::AlignHCenter,str);t.translate(0, size /10);}}qp.setFont(QFont("Arial",size/15));qp.setPen(Qt::red);int hh = size / 10;rcLeft  = QRect(rc.left(), rc.bottom()-hh*2, rc.width()/2, hh);rcRight = QRect(rc.width()/2, rc.bottom()-hh*2,rc.width()/2,hh);rcBottom = QRect(rc.left(),rc.bottom()-hh*2,rc.width(),hh);switch(state){default:qp.drawText(rcBottom,Qt::AlignCenter,"开始");break;case 1:qp.drawText(rcLeft,Qt::AlignCenter,"暂停");qp.setPen(Qt::blue);qp.drawText(rcRight, Qt::AlignCenter,"计次");break;case 2:qp.drawText(rcLeft,Qt::AlignCenter,"继续");qp.setPen(Qt::blue);qp.drawText(rcRight,Qt::AlignCenter,"重置");break;}
}void Dialog::mousePressEvent(QMouseEvent *e)
{if(Qt::LeftButton == e->button()){switch(state){default:if(rcBottom.contains(e->pos())){nMSCnt = 0;sTime = QTime::currentTime();state = 1;}break;case 1:if(rcLeft.contains(e->pos())){state = 2;nMSCnt +=sTime.msecsTo(QTime::currentTime());update();}else if(rcRight.contains(e->pos())){lstCnt.append(nMSCnt + sTime.msecsTo(QTime::currentTime()));idx = lstCnt.size() - 1;update();}break;case 2:if(rcLeft.contains(e->pos())){state = 1;sTime = QTime::currentTime();}else if(rcRight.contains(e->pos())){state = 0;nMSCnt = 0;lstCnt.clear();update();}break;}}
}void Dialog::wheelEvent(QWheelEvent *e)
{if(e->delta() >0){if(idx < lstCnt.size() -1){++idx;update();}}else {if(idx>0){--idx;update();}}
}
(2)main.cpp
#include "dialog.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

(3)规定界面,在ui界面设置里面(这里我只是简单的设计成正方形,节省时间,需要别的设计,或者探讨,可以加我QQ或者vx)

七、编译演示。
(1)如果你工程很多,需要将你要演示的调制成活动项目,如下图所示;

(2)编译 -> 运行 -> 结果显示

刚才就说过了,界面设置你除了手动画,还可以在这个函数里面进行添加,如下图所示;

废话不多说,看演示结果;

点击开始,开始计数;

点击计次,开始加次数;

暂停 -> 重置 重置之后回到清零状态;

另:看完了这个大家也可以试着设计自己手机中秒表的界面,亦或是下图的计时器,原理异曲同工,大家可以试着调用video相关函数,通过鼠标点击函数去实现声音大小的控制。等以后有空了再和大家分享计时器的制作步骤。好像可以导入视频的,那下次大家有不懂的地方给我留言,我上传操作视频也可以。

基于Qt秒表设计(Qt绘图秒表示例)相关推荐

  1. 加按键的秒表设计c语言,秒表设计C语言程序.doc

    /*----------------------------------------------- 名称:数码管显示,按键控制秒表 论坛: 编写:shifang 日期:2009.5 修改:无 内容:中 ...

  2. 加按键的秒表设计c语言,秒表设计C语言程序

    名称 数码管显示 按键控制秒表 论坛 编写 shifang 日期 2009 5 修改 无 内容 中断按键控制 数码管显示 中断 0 控制计时和停止 中断 1 清零 include 包含头文件 一般情况 ...

  3. 基于PageObject模式设计的web自动化测试示例

    PageObject模式 PageObject模式:顾名思义,就是页面对象.它的核心思想是分层设计, 强调测试.逻辑.数据和驱动相互分离.一般分层会分为: 1.对象库层 2.逻辑层 3.业务层 4.数 ...

  4. Qt + Python + OpenCV图标替换工具 之 Qt界面设计(四)

    目录 上一篇博文 程序的下载地址以及源码 Qt界面设计 上一篇博文 Qt + Python + OpenCV图标替换工具 之 Python调用dll(三) https://blog.csdn.net/ ...

  5. Python Qt GUI设计:QPainter、QPen、QBrush和QPixmap窗口绘图类(基础篇—17)

    目录 1.QPainter绘图类 2.QPen绘图类 3.QBrush绘图类 4.QPixmap绘图类 本篇博文主要介绍如何实现在窗口中绘图,在 PyQt5中,一般可以通过QPainter.QPen. ...

  6. 基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计

    基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计 一.前言 二.Pycharm安装与环境配置 2.1 Pycharm安装配置 2.2 Pycharm环境配置 三.QT界面设计 ...

  7. QT课程设计:基于QT的图像处理程序

    本文用于2022-23学年海哥QT课课程设计的制作过程索引 以下先贴放课设要求 课程设计 一.课程设计要求(每人1题) 基于QT Creator设计一个简易的数字图像处理软件,要求: 工程名含有姓名拼 ...

  8. 【电路方案】基于8086多种花色流水灯设计/8086秒表计时系统/8086电子琴设计/8086多功能密码锁设计/8086电子秒表计时器时钟系统设计/8086电子计时器控制设计/8086智能电子称称重

    基于8086多种花色流水灯仿真设计-汇编教程和protues画图 关于8086多种花色的流水冻控制电路方案,下面包含了汇编程序和配套的流水灯电路图,大家可以参考一下此方案教程.1.汇编程 CODE S ...

  9. at89s51数码管秒表c语言程序,基于AT89C51单片机的一个2位的LED数码显示作为“秒表”设计【基于单片机系统的00-99s的定时器】...

    基于AT89C51单片机的一个2位的LED数码显示作为"秒表"设计[基于单片机系统的00-99s的定时器] 工程技术学院 课程设计 题 目:用单片机AT89C51设计一个2位的LE ...

  10. 基于8051单片机实现电子时钟+数字秒表设计

    电子时钟+数字秒表设计 概述 设计任务的基本要求 整体方案 电路设计原理 软件设计 元件清单 项目下载地址 概述 电子时钟是一种利用数字电路来显示秒.分.时的计时装置,与传统的机械钟相比,它具有走时准 ...

最新文章

  1. 如何及时获得AI顶尖科研团队的最新论文与进展?只需要一份AI内参!
  2. Spring5源码 - 06 Spring Bean 生命周期流程 概述 01
  3. tf.variable_scope与tf.tf.get_variable
  4. 疯狂android源码中文乱码无gbk,我的Android进阶之旅------Android使用cmd窗口进行adb logcat时出现中文乱码问题的解决办法...
  5. bzoj 1079 [SCOI2008]着色方案
  6. linux命令apprw,linux命令学习1(示例代码)
  7. mysql for update缺点_有关mysql的for update以及 死锁问题
  8. cisco交换机端口“假死”现象
  9. 哪个版本好_揭秘爱他美奶粉哪个版本好?不同版本爱他美奶粉区别差异是什么?...
  10. Python_命名空间和作用域_25
  11. 利用AsyncHttpClient实现图片的上传与下载
  12. Java Collection Framework View
  13. Access、Trunk、Hybrid三种端口收发规则以及tagged端口和untagged端口的区别
  14. Linux部署django项目最全,linux部署django项目流程(全)
  15. CADD课程学习(8)-- 化合物库虚拟筛选(Virtual Screening)
  16. 红轴和茶轴哪个声音大 红轴和茶轴哪个适合打字
  17. 『可道云』内网穿透牛刀小试,会敲键盘就能搭建的私有云网盘
  18. ps大图缩小让小图更清晰
  19. html设置ie9兼容性视图,ie9浏览器设置兼容性视图在哪里设置
  20. bzoj 1171: 大sz的游戏, bzoj 2892: 强袭作战

热门文章

  1. R语言之长宽数据转换
  2. CUBA使用Spring查询接口
  3. 彻底清理该死的搜狗输入法
  4. 【转】我那实现了自己理想的创业老公,却一毛钱股份都没有拿到
  5. 移动端那些事儿(二)jquery手势插件之jGestures
  6. RPC 开发系列一:RPC 基本介绍
  7. c语言编程猪八戒吃西瓜,儿童故事:猪八戒吃西瓜
  8. jungle scout插件版 v5.7.1官方版
  9. 正则表达式 '^[a-zA-Z0-9''-'\s]{1,30}$' 代表什么意思?
  10. 利用python核算工资_年薪10w用Python,年薪50w利用Python