坐牢第三十七天(Qt)

作业:

使用qt做一个闹钟

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include        //标签类
#include     //行编辑器类
#include   //按钮类
#include  //多行编辑器类
#include   //定时器类
#include    //时间类
#include  //播报员
#include//鼠标事件类
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();
    }
}

你可能感兴趣的:(Qt,qt)