基于实现Qt秒表设计

基于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 gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = qt_clock
TEMPLATE = app

SOURCES += main.cpp\
        dialog.cpp

HEADERS  += dialog.h

FORMS    += 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_OBJECT

public:
    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;
          else
              nms = 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相关函数,通过鼠标点击函数去实现声音大小的控制。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • QT实现秒表项目

    本文实例为大家分享了QT实现秒表项目的具体代码,供大家参考,具体内容如下 源代码目录 mainwindow.ui窗口设计 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include<QTime> #include<QTimer> namespace Ui { class MainWindow; } class MainWindow : public QMai

  • 基于实现Qt秒表设计

    基于Qt秒表设计 这个只是虚拟机下的Dialog中设计的秒表,大家感兴趣的可以根据自己手机的秒表界面来设计,亦或是有别的想法也可以在ui中添加函数,或者是在ui界面自己添加调整.本篇将给除了给出Qt秒表设计例子之外还会为大家提供一些常用函数. 一.Qt绘图系统简介 Qt的绘图系统允许使用相同的API在屏幕和其它打印设备上进行绘制.整个绘图系统基于 QPainter,QPainterDevice和QPaintEngine三个类. QPainter用来执行绘制的操作: QPaintDevice则允许

  • Qt实现简易秒表设计

    Qt–简易秒表设计(QTimer,Qtime,TableWiget应用),供大家参考,具体内容如下 效果图 使用QTimer和QTime两个类 思路: 1.计时功能:​ 利用QTimer中的定时器中断信号,设置每10毫秒触发一次timeout信号,在对应槽函数中对LCD number中显示的时间进行更新,即LCD屏中每十毫秒更新一次:对于时间的累加显示(QTimer是定时器)需要Qtime,在每一次timeout信号出发时,使Qtime类的time累加上10ms. 部分关键代码如下(代码并非连续

  • 基于Python+QT的gui程序开发实现

    最近帮朋友做了一个将文本文件按条件导出到excel里面的小程序.使用了PyQT,发现Python真是一门强大的脚本语言,开发效率极高. 首先需要引用 from PyQt4 import QtGui, uic, QtCore 很多控件像QPushButton是从QtGui的空间中得来的,下面def __init__(self, parent=None)中定义了界面的设计及与控件相互联系的方法. class AddressBook(QtGui.QWidget): def __init__(self,

  • 基于Bootstrap的网页设计实例

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html > <html> <head> <meta http-equiv="Content-Type" content=&qu

  • pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

    1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮.并转换成mainWindow.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'f.ui' # # Created by: PyQt5 UI code generator 5.9 # # WARNING! All changes made in this file will be lost!

  • Java实战之基于I/O流设计的图书管理系统

    一.前言 当前,我还没有学到数据库相关的知识,想要完全通过Java来完成一个可以存储数据的图书馆管理系统就只能使用I/O流的知识,将内容都保存到文件中,再进行增删改查的操作,这就很考验我们的Java基础知识掌握能力. 二.项目介绍 Java基本语法的掌握 流程控制语句的熟练使用 面向对象思想的理解 能否熟练使用封装.继承.多态 接口.异常的熟悉 集合的使用 是否熟悉掌握I/O流相关操作 三.项目说明 传统的人工管理图书馆流程繁琐,我们需求设计一个图书馆管理系统来方便学生借书以及管理员管理书籍 系

  • 基于mysql的bbs设计(四)

    5.版面模块设计   所谓分类,更多的是为telnet服务端考虑的,在cq66模式下,用户可以按 照自己的意愿进行分类,反正最后都是直接以版为基本单位访问的.   对于版面文章的访问,存放的时候以整篇文章为参数,文章的分块由本层 完成,如果上层以块为单位传送,则在上层全部传完,组合后,再传参到本层 分解:在读取 的时候,本层则以块为单位访问,如果上层要以全文为单位访问 ,则在上层做合并 工作,本层不管.   至于要不要独立出索引,不影响上层的操作,主要和下层的数据库构造有 关, 主要考虑可行性,

  • 基于mysql的bbs设计(一)

    1.系统架构:   采用模块化思想,分为3层:   a.数据存储层:使用mysql来存放bbs的所有数据,包括用户信息,     文章数据,用户信件,用户消息,系统数据(?),关键问题:     数据库的规划,是否用文件来辅助.   b.系统功能层:完成bbs的基本功能,由多个并列模块组成,向下     调用mysql的函数访问数据库,向上,接受处理请求,将处理的     结果返回上层,根据请求类型,返回成败结果和其他数据.而且     模块高度灵活,可以方便的修改增加.包括:     ** 用

  • 基于mysql的bbs设计(三)

    4.用户模块设计   对于底层数据库,调用mysql的C API函数来进行数据库的修改,内部保存 一定的状态变量(例如用户名,还是留给上一层完成?),对上一层,则提供 用户管理的接口.   Class UserManage {   private:     char  myuserid[20]; // 用户的id,未登陆前为空     time  logintime; // 用户登陆时间,并用于计算停留时间     char  loginhost[20]; //上站地点. public:    

  • 基于mysql的bbs设计(二)

    3.数据库设计   关键还是mysql的效率问题,合理分配mysql的内存,特别是table cache的 大小.另外,当系统突然掉电呢?mysql是否robust?   table的名字设计,采用一位前缀表明类型,全部用小写表示(?),例如: 系统的数据库,以s为前导,如用户表:suser(sUSER 呢?),具体如下:   s :系统表,suser,sclass   m :用户信件表,msysop,mdrangon   w :用户消息表,wsysop,wdrangon   a :版面索引表,

随机推荐