坐牢第三十七天(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();
    }
}
相关推荐
Prejudices10 小时前
在 Qt 中使用中文
开发语言·c++·qt
码力码力我爱你11 小时前
Vue Application exit (SharedArrayBuffer is not defined)
linux·前端·javascript·qt·vue·wasm·webassembly
ljp_nan13 小时前
Qt --- 信号和信号槽
开发语言·qt
牵牛老人19 小时前
Qt技巧(三)编辑框嵌入按钮,系统位数判断,判断某对象是否属于某种类,控件取句柄,支持4K,巧用QEventLoop,QWidget的窗体样式
开发语言·qt
十启树1 天前
用Qt 对接‌百度语音识别接口
人工智能·qt·百度·语音识别
孙鹏宇.1 天前
Json和Http专栏
开发语言·qt
姆路1 天前
高亮下位机温湿度
c++·qt
金博客1 天前
Qt QSerialPort数据发送和接收DataComm
c++·qt·qt6.3
景小雨1 天前
用Inno Setup打包QT程序输出安装包
开发语言·qt·个人开发·inno setup
羊小猪~~1 天前
C/C++语言基础--从C到C++的不同(上)
linux·c语言·c++·后端·qt·visualstudio·visual studio code