坐牢第三十七天(Qt)
作业:
使用qt做一个闹钟
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPixmap>
#include <QBitmap>
#include <QLabel> //标签类
#include <QLineEdit> //行编辑器类
#include <QPushButton> //按钮类
#include <QTextEdit> //多行编辑器类
#include <QTimer> //定时器类
#include <QTime> //时间类
#include <QtTextToSpeech> //播报员
#include<QMouseEvent>//鼠标事件类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//鼠标事件
void mouseMoveEvent(QMouseEvent *event) override; //鼠标移动事件
void mousePressEvent(QMouseEvent *event) override; //鼠标点击事件
public slots:
void My_slot_1();
void timeout_slot();
signals:
void My_signal_1();
private:
Ui::Widget *ui;
QLabel *lab_jm;
QLabel *lab_time;
QLabel *lab_show;
QPushButton *btn_1;
QLineEdit *edit_time;
QPushButton *btn_2;
QTextEdit *textedit ;
/****************************/
QTimer t1;//定时器
QTextToSpeech *speecher;//播报员
QPoint temp;//中间辅助向量
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/************************************界面************************************/
//1.设置界面
this->setFixedSize(800,800);//固定大小
this->setWindowFlag(Qt::FramelessWindowHint);//设置窗口纯净
//2.加载背景图
lab_jm =new QLabel(this);
lab_jm->move(0,0);
lab_jm->resize(800,800);
lab_jm->setPixmap(QPixmap(":/icon/xaingrikui.jpg"));
lab_jm->setScaledContents(true);
lab_jm->setWindowOpacity(0.8);
/***********************************标签*************************************/
//1.1时间的标签
lab_time =new QLabel("现在时间",this);
lab_time->resize(100,100);
lab_time->move(50,70);
//创建新字体
QFont font1;
font1.setFamily("Arial"); // 设置字体为Arial
font1.setPointSize(12); // 设置字体大小为12号
font1.setBold(true); // 设置字体为粗体
// 将新字体应用到行编辑器
lab_time->setFont(font1);
//2.1展示具体时间的标签
lab_show=new QLabel(this);
lab_show->resize(400,100);
lab_show->move(lab_time->x(),lab_time->y()+lab_time->height());
lab_show->setStyleSheet("background-color :rgb(135,206,250));");
//创建新字体
QFont font;
font.setFamily("Arial"); // 设置字体为Arial
font.setPointSize(16); // 设置字体大小为16号
font.setBold(true); // 设置字体为粗体
// 将新字体应用到行编辑器
lab_show->setFont(font);
/***********************************行编辑器*************************************/
//写入定时时间行编辑器
edit_time =new QLineEdit(this);
edit_time->resize(200,90);
edit_time->move(lab_show->x()+lab_show->width()+30,lab_show->y());
//将字体应用到行编辑器
edit_time->setFont(font);
/***********************************按钮*************************************/
//1.启动按钮
btn_1 =new QPushButton("启动",this);
btn_1->resize(80,40);
btn_1->move(edit_time->x()-20,edit_time->y()+edit_time->height()+10);
btn_1->setFont(font1);
//2.取消按钮
btn_2 =new QPushButton("取消",this);
btn_2->resize(80,40);
btn_2->move(btn_1->x()+edit_time->width()-40,btn_1->y());
btn_2->setEnabled(false);
btn_2->setFont(font1);
/***********************************播报多行编辑器*************************************/
//用于写入播报内容的多行编辑器
textedit =new QTextEdit(this);
textedit->resize(750,400);
textedit->move(25,350);
textedit->setFont(font);
/***********************************展示时间*************************************/
//1.启动按钮绑定
connect(btn_1,&QPushButton::clicked,this,&Widget::My_slot_1);
//2.由于定时器事件的信号与槽的绑定只需要一次,所以直接写在构造函数中即可
connect(&t1, &QTimer::timeout, this, &Widget::timeout_slot);
//3.取消按钮
connect(btn_2,&QPushButton::clicked,[&]{
edit_time->clear();
textedit->clear();
});
//给播报员分配内存空间
speecher =new QTextToSpeech;
btn_2->setEnabled(false);
}
Widget::~Widget()
{
delete ui;
}
//1.启动按钮槽函数
void Widget::My_slot_1()
{
if(btn_1->text()=="启动")
{
//启动一个定时器
t1.start(1000); //每隔指定的时间,发送一个timeout的信号
btn_1->setText("开始");
btn_2->setEnabled(true);
}else
{
//当在运行脑子时使一些功能和按钮不可用
btn_1->setEnabled(false);
edit_time->setReadOnly(true);
textedit->setReadOnly(true);
}
}
//2.展示槽函数
void Widget::timeout_slot()
{
//获取系统的时间
QTime sysTime = QTime::currentTime();
//将QTime类对象转变成字符串
QString tm = sysTime.toString("hh:mm:ss");
//将时间展示到ui界面上
lab_show->setText(tm);
//lab_show->setAlignment(Qt::AlignCenter);//居中
//行编辑器和时间对比
if(edit_time->text()== lab_show->text())
{
//让播报员播报出多行编辑器里的内容
speecher->say(textedit->toPlainText());
//让那些按钮和编辑器变得可用
btn_1->setEnabled(true);
edit_time->setReadOnly(false);
textedit->setReadOnly(false);
}
}
//界面和鼠标跟着走函数
void Widget::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件
{
this->move(event->globalPos()-temp);
}
void Widget::mousePressEvent(QMouseEvent *event)//鼠标按下事件
{
temp=event->globalPos()-this->pos();//求出中间辅助向量
if(event->button() ==Qt::RightButton)
{
this->close();
}
}