Qt学习笔记--自制简易小秒表

新手也能做的超简易小秒表

界面:
在这里插入图片描述
设置初值:

点击确认后上部分消失
在这里插入图片描述
在这里插入图片描述

头文件、析构函数已省略
cpp文件里代码不做说明即在构造函数内

--------------------------------------mainwindow.h-----------------------------------

-------------------------------------------------------------------------------------
public:
    void closeEvent(QCloseEvent *e);
    void timerEvent(QTimerEvent *);
private:
    Ui::MainWindow *ui;
    int timeid;
    int timersec;
    int min;
    int sec;
    int ms;

--------------------------------------mainwindow.cpp---------------------------------

-------------------------------------------------------------------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "subwindow.h"

#include<QAction>
#include<QMessageBox>
#include<QDebug>
#include<QCloseEvent>
#include<QDateTimeEdit>
#include<QString>
#include<QLineEdit>
#include<QVector>
#include<QSpinBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //设置初值
    min=0;
    sec=0;
    ms=0;
    int i=0;
    this->resize(500,600);

    //记录放在向量中
    QVector<QLabel *> v;

    //记录的子窗口
    SubWindow *sub=new SubWindow(this);
    QWidget *subwi=new QWidget(sub);
    sub->setCentralWidget(subwi);


    //开始
    connect(ui->start,&QPushButton::clicked,
            [=]()
            {
                timeid=this->startTimer(1);//1ms一中断
                timersec=0;
            });
    //记录
    connect(ui->record,&QPushButton::clicked,
            [=]()mutable
            {
                    v.push_back(new QLabel);
                    v[i]->setParent(sub);
                    v[i]->resize(500,40);
                    v[i]->move(0,40*i);
                    v[i]->show();
                    v[i]->setText(QString("<center><h1>RECORD %1: %2min %3s %4ms</h1></center></n>").arg(i++).arg(timersec/60000+min).
                                  arg(timersec/1000%60+sec). arg(timersec%1000+ms));
            });
    //显示记录
    connect(ui->checkrecord,&QPushButton::clicked,
            [=]()
            {
                sub->show();
                sub->resize(500,400);

            });
    //暂停
    connect(ui->suspended,&QPushButton::clicked,
            [=]()
            {
                this->killTimer(timeid);
            });

    //设置初值
    SubWidget *setnew=new SubWidget(this);
    setnew->hide();
    setnew->setAttribute(Qt::WA_DeleteOnClose,true);

    //点击“设置初值”有SubWidget类的对象弹出进行设置
    connect(ui->reset,&QPushButton::clicked,
            [=]()
            {
                setnew->show();
            });

    //当按下设置setnew的确认按钮后发送MySignal信号接受到后下列操作
    connect(setnew,&SubWidget::MySignal,
            [=]()mutable
            {
                timersec=0;
                min=setnew->getmin();
                sec=setnew->getsec();
                ms=setnew->getms();
                ui->lineEdit->setText(QString("             %1min %2s %3ms").arg(min).arg(sec).arg(ms));

                setnew->hide();

            });

}
//关闭事件
void MainWindow::closeEvent(QCloseEvent *e)
{
    int ret=QMessageBox::question(this,"关闭","是否关闭窗口");
    if(ret==QMessageBox::Yes)
    {
        e->accept();
        qDebug()<<"close";
    }

    if(ret==QMessageBox::No)
    {
        e->ignore();
        qDebug()<<"open";
    }
}
void MainWindow::timerEvent(QTimerEvent *)//定时器
{
        ui->lineEdit->setReadOnly(true);
        timersec++;
        ui->lineEdit->setText(QString("             %1min %2s %3ms ").arg(timersec/60000+min).
                     arg(timersec/1000%60+sec). arg(timersec%1000+ms));
        if(timersec==60000)
        {
            timersec=0;
        }
}

SubWidget继承于Widget类
自定义为设置初值的窗口

--------------------------------------subwiget.h-----------------------------------

-------------------------------------------------------------------------------------
public:
    SubWidget(QWidget *parent);
    ~SubWidget();

    int getmin(){return newmin;};
    int getsec(){return newsec;};
    int getms(){return newms;};
    void Myslot();

signals:
    void MySignal();
private:
    QSpinBox *a=new QSpinBox(this);
    QSpinBox *b=new QSpinBox(this);
    QSpinBox *c=new QSpinBox(this);
    int newmin;
    int newsec;
    int newms;


--------------------------------------subwiget.cpp---------------------------------

-------------------------------------------------------------------------------------
#include "subwidget.h"
#include<QPushButton>
#include<QSpinBox>
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{

    this->resize(500,100);
    QHBoxLayout *layout = new QHBoxLayout(this);
    QPushButton *setyes=new QPushButton(this);
    setyes->setText("确认");

    layout->addWidget(a);
    layout->addWidget(b);
    layout->addWidget(c);
    a->setValue(0);
    b->setValue(0);
    c->setValue(0);
    a->setRange(0,59);
    b->setRange(0,59);
    c->setRange(0,999);
    a->show();
    b->show();
    c->show();

    connect(a, QOverload<int>::of(&QSpinBox::valueChanged),
            [=](int i)
            {
                  newmin=i;
            });
    connect(b, QOverload<int>::of(&QSpinBox::valueChanged),
            [=](int i)
            {
                newsec=i;
            });
    connect(c, QOverload<int>::of(&QSpinBox::valueChanged),
            [=](int i)
            {
                newms=i;
            });
    this->setLayout(layout);
    layout->setGeometry(QRect(1,1,80,80));

    connect(setyes,&QPushButton::pressed,this,&SubWidget::Myslot);
}
 void SubWidget::Myslot()
 {
     emit MySignal();
 }

subwindow里只是添加关闭事件

--------------------------------------subwindow.h------------------------------------

-------------------------------------------------------------------------------------
void closeEvent(QCloseEvent *e);
--------------------------------------subwindow.cpp----------------------------------

-------------------------------------------------------------------------------------

void SubWindow::closeEvent(QCloseEvent *e)
{
    int ret=QMessageBox::question(this,"关闭","是否关闭窗口");
    if(ret==QMessageBox::Yes)
    {
        //关闭窗口
        //处理关闭窗口事件,接收事件,事件就不会往下传

        e->accept();
        qDebug()<<"close";
    }

    if(ret==QMessageBox::No)
    {
        //不关闭窗口
        //忽略事件,事件继续给父组件传递
        e->ignore();
        qDebug()<<"open";
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值