新手也能做的超简易小秒表
界面:
设置初值:
点击确认后上部分消失
头文件、析构函数已省略
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";
}
}