使用QT框架的数字钟
具体实现方式:
1、由于要使用QSound类,需要在.pro文件中添加
QT+=muitimedia这一行代码
2、整个工程项目如下:
3、时钟的具体实现方法:
(1)头文件:
#ifndef MYCLOCK_H
#define MYCLOCK_H
#include <QObject>
#include<QVector>
#include<QSound>
class MyClock : public QObject
{
Q_OBJECT
public:
explicit MyClock(QObject *parent = nullptr);
void reset(int year1,int month1,int day1,int hour1,int min1,int second1);
void setRing(int hour_t,int min_t);
void Ring();
QVector<int> get_time();
void count();
private:
int hour;
int min;
int second;
int day;
int month;
int year;
int ringhour;
int ringmin;
signals:
};
#endif // MYCLOCK_H
(2)各个类的方法的具体实现
#include "myclock.h"
#include<QDebug>
MyClock::MyClock(QObject *parent) : QObject(parent)
{
year=2021;
month=3;
day=31;
hour=23;
min=59;
second=55;
}
void MyClock::setRing(int hour_t, int min_t)
{
ringhour=hour_t;
ringmin=min_t;
}
void MyClock::Ring()
{
if((hour==ringhour)&(min==ringmin)&(second==0))
{
QSound *sound1=new QSound(":/calling.wav");
sound1->play();
}
}
QVector<int> MyClock::get_time()
{
QVector<int> t;
t.push_back(year);
t.push_back(month);
t.push_back(day);
t.push_back(hour);
t.push_back(min);
t.push_back(second);
return t;
}
void MyClock::count()
{
second++;
if(second==60)
{
second=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
day++;
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&(day==32))
{
day=1;
month+=1;
}
if((month==4||month==6||month==9||month==10||month==11)&&(day==31))
{
day=1;
month+=1;
}
if(year%4==0&&month==2&&month==30)
{
day=1;
month+=1;
}
if(year%4!=0&&month==2&&month==29)
{
day=1;
month+=1;
}
if(month==13)
{
month=1;
day=1;
hour=0;
min=0;
second=0;
}
}
}
}
if(((hour==0)&(min==0)&(second==0))||((hour!=0)&(min==0)&(second==0)))
{
QSound *sound=new QSound(":/LevelWinSound.wav");
sound->play();
}
Ring();
}
void MyClock::reset(int year1, int month1, int day1, int hour1, int min1, int second1)
{
year=year1;
month=month1;
day=day1;
hour=hour1;
min=min1;
second=second1;
}
4、秒表
(1)头文件
#ifndef MINCLOCK_H
#define MINCLOCK_H
#include <QObject>
#include<QVector>
class MinClock : public QObject
{
Q_OBJECT
public:
explicit MinClock(QObject *parent = nullptr);
QVector<int> get_time();
void count();
void reset();
private:
int second;
int minsecond;
signals:
};
#endif // MINCLOCK_H
(2)实现
#include "minclock.h"
MinClock::MinClock(QObject *parent) : QObject(parent)
{
second=0;
minsecond=0;
}
void MinClock::count()
{
minsecond++;
if(minsecond==1000)
{
second++;
minsecond=0;
}
}
void MinClock::reset()
{
second=0;
minsecond=0;
}
QVector<int> MinClock::get_time()
{
QVector<int> t;
t.push_back(second);
t.push_back(minsecond);
return t;
}
5、年月日,时分秒的设置对话框
(1)
#ifndef TIMESET_H
#define TIMESET_H
#include <QMainWindow>
#include<QVector>
class TimeSet : public QMainWindow
{
Q_OBJECT
public:
explicit TimeSet(QWidget *parent = nullptr);
QVector<int> vector;
QVector<int> Return();
signals:
void set();
};
#endif // TIMESET_H
(2)
#include "timeset.h"
#include<QMessageBox>
#include<QLineEdit>
#include<QPushButton>
#include<QLabel>
#include<QString>
TimeSet::TimeSet(QWidget *parent) : QMainWindow(parent)
{
this->setFixedSize(450,300);
QLabel *label1=new QLabel(this);
label1->setText("年");
QLineEdit *edit1=new QLineEdit(this);
edit1->move(150,0);
QLabel *label2=new QLabel(this);
label2->setText("月");
label2->move(0,40);
QLineEdit *edit2=new QLineEdit(this);
edit2->move(150,40);
QLabel *label3=new QLabel(this);
label3->setText("日");
label3->move(0,80);
QLineEdit *edit3=new QLineEdit(this);
edit3->move(150,80);
QLabel *label4=new QLabel(this);
label4->setText("时");
label4->move(0,120);
QLineEdit *edit4=new QLineEdit(this);
edit4->move(150,120);
QLabel *label5=new QLabel(this);
label5->setText("分");
label5->move(0,160);
QLineEdit *edit5=new QLineEdit(this);
edit5->move(150,160);
QLabel *label6=new QLabel(this);
label6->setText("秒");
label6->move(0,200);
QLineEdit *edit6=new QLineEdit(this);
edit6->move(150,200);
QPushButton *btn=new QPushButton(this);
btn->setText("确定");
btn->move(350,210);
connect(btn,&QPushButton::clicked,this,[=](){
QString string1=edit1->text();
QString string2=edit2->text();
QString string3=edit3->text();
QString string4=edit4->text();
QString string5=edit5->text();
QString string6=edit6->text();
int val1,val2,val3,val4,val5,val6;
val1=string1.toInt();
val2=string2.toInt();
val3=string3.toInt();
val4=string4.toInt();
val5=string5.toInt();
val6=string6.toInt();
if((val1<0)|(val2<0|val2>12)|((val1%4==0)&(val2==2)&(val3>29))|((val1%4!=0)&(val2==2)&(val3>28))|((val2==1|val2==3|val2==5|val2==7|val2==8|val2==10|val2==12)&(val3>31))|(((val2==4)|(val2==6)|(val2==9)|(val2=11))&(val3>30))|(val4<0|val4>24)|(val5<0|val5>60)|(val6<0|val6>60))
{
QMessageBox::critical(this,"错误","数据输入错误");
}
else
{
vector.push_back(string1.toInt());
vector.push_back(string2.toInt());
vector.push_back(string3.toInt());
vector.push_back(string4.toInt());
vector.push_back(string5.toInt());
vector.push_back(string6.toInt());
QMessageBox::information(this,"已设置","完成");
emit set();
}
});
}
QVector<int> TimeSet::Return()
{
return vector;
}
6、设置闹钟
(1)
#ifndef SETCLOCK_H
#define SETCLOCK_H
#include <QMainWindow>
#include<QVector>
\
class SetClock : public QMainWindow
{
Q_OBJECT
public:
explicit SetClock(QWidget *parent = nullptr);
QVector<int> returnsetting();
QVector<int> vector;
signals:
void setting();
};
#endif // SETCLOCK_H
(2)
#include "setclock.h"
#include<QPushButton>
#include<QLabel>
#include<QLineEdit>
#include<QVector>
#include<QMessageBox>
#include<QDebug>
SetClock::SetClock(QWidget *parent) : QMainWindow(parent)
{
this->setFixedSize(400,330);
QLabel *label1=new QLabel(this);
label1->setText("时");
QLineEdit *edit1=new QLineEdit(this);
edit1->move(120,0);
QLabel *label2=new QLabel(this);
label2->setText("分");
QLineEdit *edit2=new QLineEdit(this);
label2->move(0,50);
edit2->move(120,50);
QPushButton *btn=new QPushButton(this);
btn->setText("确认");
btn->move(200,150);
connect(btn,&QPushButton::clicked,this,[=](){
QString str1=edit1->text();
QString str2=edit2->text();
if((str1.toDouble()<=23&str1.toDouble()>=0)&(str2.toDouble()>=0&str2.toDouble()<60))
{
int val1=str1.toInt();
int val2=str2.toInt();
vector.push_back(val1);
vector.push_back(val2);
QMessageBox::information(this,"已设置","OK");
emit setting();
}
else
{
QMessageBox::critical(this,"错误","hour应该设置到0到24,min应该设置到0到60");
}
});
}
QVector<int> SetClock::returnsetting()
{
return vector;
}
7、搞笑担当(汤家凤老师放过我)
(1)
#ifndef TANGGOD_H
#define TANGGOD_H
#include <QMainWindow>
class TangGod : public QMainWindow
{
Q_OBJECT
public:
explicit TangGod(QWidget *parent = nullptr);
void paintEvent(QPaintEvent*);
signals:
};
#endif // TANGGOD_H
(2)
#include "tanggod.h"
#include<QPainter>
#include<QPixmap>
#include<QSound>
#include<QPushButton>
TangGod::TangGod(QWidget *parent) : QMainWindow(parent)
{
this->setFixedSize(300,200);
QSound *sound=new QSound(":/calling.wav");
sound->play();
QPushButton *btn=new QPushButton(this);
btn->setText("老师我错了,别念了");
btn->resize(160,30);
connect(btn,&QPushButton::clicked,this,[=](){
sound->stop();
});
}
void TangGod::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(":/sleep.jpg");
painter.drawPixmap(0,0,this->width(),this->height(),pix);
}
8、主界面
(1)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QLabel>
#include<QPushButton>
#include<QTimer>
#include"myclock.h"
#include"minclock.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void paintEvent(QPaintEvent*);
void CalcPostion();
void drawClockDial(QPainter *painter);
float radious;
int xSecond,ySecond,xHour,yHour,xMinute,yMinute;
int xCenter,yCenter;
int second,minute,hour;
signals:
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
(2)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"setclock.h"
#include"timeset.h"
#include"tanggod.h"
#include<QPushButton>
#include<QLabel>
#include<QPixmap>
#include<QPainter>
#include<qmath.h>
#define PI 3.14159265
int flag=0,flag1=0;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setFixedSize(676,412);
this->setWindowTitle("Clock");
radious=120;
xCenter=150;
yCenter=150;
QTimer *timer=new QTimer(this);
MyClock *clock=new MyClock(this);
connect(ui->actionquite,&QAction::triggered,this,&QMainWindow::close);
connect(ui->actiongod,&QAction::triggered,this,[=](){
TangGod *god=new TangGod(this);
god->show();
});
clock->setRing(0,1);
timer->start(1000);
connect(timer,&QTimer::timeout,this,[=](){
clock->count();
QVector<int> t=clock->get_time();
hour=t[3];
minute=t[4];
second=t[5];
CalcPostion();
update();
ui->label->setText(QString::number(t[0]));
ui->label_2->setText(QString::number(t[1]));
ui->label_3->setText(QString::number(t[2]));
ui->label_4->setText(QString::number(t[3]));
ui->label_5->setText(QString::number(t[4]));
ui->label_6->setText(QString::number(t[5]));
});
QPushButton *btn=new QPushButton(this);
btn->setText("关闭闹钟(已设时间)");
btn->move(355,160);
QPushButton *btn1=new QPushButton(this);
btn1->setText("设置闹钟");
btn1->move(465,160);
QPushButton *btn2=new QPushButton(this);
btn2->setText("设置时间");
btn2->move(575,160);
connect(btn,&QPushButton::clicked,this,[=](){
clock->setRing(25,65);
});
connect(btn1,&QPushButton::clicked,this,[=](){
SetClock *dialog=new SetClock(this);
dialog->show();
connect(dialog,&SetClock::setting,this,[=](){
QVector<int> t=dialog->returnsetting();
clock->setRing(t[0],t[1]);
QTimer::singleShot(250,this,[=](){
dialog->close();
delete dialog;
});
});
});
connect(btn2,&QPushButton::clicked,this,[=](){
TimeSet *timeset=new TimeSet(this);
timeset->show();
connect(timeset,&TimeSet::set,this,[=](){
QVector<int> t1=timeset->Return();
clock->reset(t1[0],t1[1],t1[2],t1[3],t1[4],t1[5]);
QTimer::singleShot(250,this,[=](){
timeset->close();
delete timeset;
});
});
});
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
ui->pushButton->setEnabled(false);
QTimer *timer1=new QTimer(this);
MinClock *minclock=new MinClock(this);
timer1->start(1);
connect(timer1,&QTimer::timeout,this,[=](){
minclock->count();
QVector<int> t1=minclock->get_time();
ui->label_7->setText(QString::number(t1[0]));
ui->label_8->setText(QString::number(t1[1]));
});
connect(ui->pushButton_2,&QPushButton::clicked,this,[=](){
if(flag%2==0)
{
timer1->stop();
ui->pushButton_2->setText("继续");
}
else
{
timer1->start(1);
ui->pushButton_2->setText("暂停");
}
flag++;
});
});
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen;
painter.drawEllipse(QPointF(150.0,150.0),radious,radious);
painter.drawLine(xCenter,yCenter,xSecond,ySecond);
pen.setWidth(2);
painter.setPen(pen);
painter.drawLine(xCenter,yCenter,xMinute,yMinute);
pen.setWidth(4);
painter.setPen(pen);
painter.drawLine(xCenter,yCenter,xHour,yHour);
}
void MainWindow::CalcPostion()
{
double minuteHandLen,secondHandLen,hourHandLen;
secondHandLen=radious*0.75;
minuteHandLen=radious*0.55;
hourHandLen=radious*0.25;
xSecond=xCenter+secondHandLen*cos(second*PI/30-PI/2);
ySecond=yCenter+secondHandLen*sin(second*PI/30-PI/2);
xMinute=xCenter+minuteHandLen*cos(minute*PI/30-PI/2);
yMinute=yCenter+minuteHandLen*sin(minute*PI/30-PI/2);
xHour=xCenter+hourHandLen*cos((hour+1.0*minute/60)*PI/6-PI/2);
yHour=yCenter+hourHandLen*sin((hour+1.0*minute/60)*PI/6-PI/2);
}
MainWindow::~MainWindow()
{
delete ui;
}
9、主函数(QT的千篇一律,没什么好说的)
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
10、文件打包,发布
在界面中选择版本从debug改为realease版本,之后在文件夹内shift+鼠标右键
之后输入如下指令:
windeployqt.exe clock.exe(我所写的最后的可执行文件名为clock,根据各自的命名输入指令)
11、完整发布:
使用HM NIS edit完成
(1)软件界面
(2)创建脚本
(3)
(4)
(5)选选择语言,简体中文为SimplChinese
(6)
如果授权文件不存在
则会出现如下错误
(7)
选择好对应文件
(8)
选下一步即可
(9)
依旧是下一步
(10)
(11)
按照如下方式设置
(12)
另存
(13)
编译
写在最后:
文章中所用到的资源百度云链接:
链接: https://pan.baidu.com/s/1AoKdgyKmct7D_Cw3bLBt_A 提取码: ai6u 复制这段内容后打开百度网盘手机App,操作更方便哦