当前位置: 首页 > article >正文

坐牢第三十七天(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();
    }
}


http://www.kler.cn/a/301406.html

相关文章:

  • 《Django 5 By Example》阅读笔记:p645-p650
  • PyTorch实战-手写数字识别-单层感知机
  • resnet50,clip,Faiss+Flask简易图文搜索服务
  • Ubuntu 18.04 配置sources.list源文件(无法安全地用该源进行更新,所以默认禁用该源)
  • Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件
  • Spring Boot教程之Spring Boot简介
  • 影刀RPA实战:自动化同步商品库存至各大电商平台(二)
  • 骨传导耳机哪个品牌好用?良心测评推荐5大高分骨传导耳机!
  • Python | Leetcode Python题解之第393题UTF-8编码验证
  • 大模型LLM之SpringAI:Web+AI(二)
  • Android——service使用详解
  • 快速上手Spring Boot应用
  • Python语言开发学习之使用Python预测天气
  • 二十三种设计模式之建造者模式(类比汽车制造厂好理解一些)
  • sqlite3 相关知识
  • 嵌入式边缘计算:融合创新与未来展望
  • 有关WSL和docker的介绍
  • Qt-常用控件(3)-多元素控件、容器类控件和布局管理器
  • 在 ArkTS 中,如何有效地进行内存管理和避免内存泄漏?
  • Android12_13左上角状态栏数字时间显示右移动
  • 文档大模型,能否真正解决非结构化数据难题
  • 【kubernetes】配置管理中心Configmap运用
  • vue2实现歌曲播放和歌词滚动效果
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战5-基础语法
  • 【F的领地】项目拆解:小学教辅资料
  • 海外云手机——跨国业务的高效工具