2025.2.11

news/2025/2/22 4:36:51

1> 制作一个闹钟软件

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTime>
#include <QTimer>
#include <QTimeEdit>
#include <QDateEdit>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QPushButton *btn1;
    QPushButton *btn2;
    QLabel *lab;
    QLineEdit *edit;
    QTimer *timer;
    QTimeEdit *timeedit;
    QTime alarmTime;
    bool alarmSet;
private slots:
    void update_slot();
    void setAlarm_slot();
    void cancel_slot();
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTime>
#include <QTimer>
#include <string>
#include <QMessageBox>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    setFixedSize(800,400);

    //创建垂直布局

    //获取标签
    QLabel *lab = new QLabel(this);
    lab->setGeometry(80,50,200,50);
    lab->setStyleSheet(
        "border: 2px solid black;"      // 黑色边框,宽度为2px
        "border-radius: 5px;"           // 边框圆角,值越大圆角越明显
        "background-color: lightgray;"  // 背景颜色
        "font: 16px Arial;"             // 字体和大小
    );
    QLabel *lab1 = new QLabel(this);
    lab1->setGeometry(30,180,740,220);
    lab1->setStyleSheet(
        "border: 2px solid black;"      // 黑色边框,宽度为2px
        "border-radius: 5px;"           // 边框圆角,值越大圆角越明显
        "background-color: lightgray;"  // 背景颜色
        "font: 16px Arial;"             // 字体和大小
    );
    // 设置标签的文本内容
    QString motivationalText = "三更灯火五更鸡,\n正是男儿读书时,\n黑发不知勤学早,\n白手方悔读书迟。";

    // 设置文本对齐方式,居中显示
    lab1->setText(motivationalText);
    lab1->setAlignment(Qt::AlignCenter);  // 设置文本居中

    //创建时间选择器
    timeedit = new QTimeEdit(this);
    timeedit->setGeometry(450,50,250,50);
    timeedit->setDisplayFormat("HH:mm:ss");
    timeedit->setTime(QTime::currentTime());

    //设置按钮
    btn1 = new QPushButton(this);//启动
    btn2 = new QPushButton(this);//取消
    btn1->setGeometry(450,110,65,30);
    btn2->setGeometry(600,110,65,30);
    btn1->setText("启动");
    btn2->setText("取消");

    //获取系统当前的时间
    QTime sysTime = QTime::currentTime();
    //将时间转化为字符串
    QString t = sysTime.toString("hh:mm:ss");
    lab->setText(t);

    //创建定时器
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::update_slot);
    //启动定时器
    timer->start(1000);

    //连接按钮点击事件
    connect(btn1,&QPushButton::clicked,this,&Widget::setAlarm_slot);
    connect(btn2,&QPushButton::clicked,this,&Widget::cancel_slot);

    //初始化闹钟
    alarmSet = false;

}


void Widget::update_slot()
{

    //每秒获取当前时间并更新
    //获取系统当前的时间
    QTime sysTime = QTime::currentTime();
    //将时间转化为字符串
    QString t = sysTime.toString("hh:mm:ss");
    // 获取父类窗口中的lab标签,并更新文本
       QLabel *lab = findChild<QLabel *>();
       if (lab)
       {
           lab->setText(t);
       }
      //判断闹钟
       if(alarmSet && sysTime >= alarmTime )
       {
           QMessageBox::information(this,"闹钟","时间到");
           alarmSet = false;
       }
}

Widget::~Widget()
{
    delete ui;
}
//设置
void Widget::setAlarm_slot()
{
    //获取设置的闹钟时间
    alarmTime = timeedit->time();
    //启动闹钟
    if(!alarmSet)
    {
        alarmSet = true;
        QMessageBox::information(this, "闹钟", "闹钟已启动");

    }else
    {
        QMessageBox::information(this, "闹钟", "无法重复设置");
    }
}
//取消
void Widget::cancel_slot()
{
    //timer->stop();
        alarmSet = false;
        QMessageBox::information(this, "闹钟取消", "闹钟已取消");
}

3> 将网络聊天室服务器端,重新实现一遍

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>          //服务器类
#include <QTcpSocket>          //客户端类
#include <QVector>             //动态数组类
#include <QMessageBox>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_startbtn_clicked();
    void newConnect_slot();
    void readyRead_slot();
private:
    Ui::Widget *ui;
    QTcpServer *server;
    QVector<QTcpSocket*> client_vector;
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化一个服务器对象
    server = new QTcpServer(this);
    //将服务器的newConnect信号连接到自定义的槽函数中
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnect_slot);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_startbtn_clicked()
{
    quint16 port = ui->portedit->text().toUInt();
    //启动服务器
    //函数原型:bool listen(const)
    if(server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"提示","服务器打开成功");
    }else
    {
        QMessageBox::information(this,"提示","服务器打开失败");
        return;
    }
}
//newConnect对应槽函数的实现
void Widget::newConnect_slot()
{
    qDebug()<<"有新的客户端连接成功";

    //获取最新连接的客户端套接字
    QTcpSocket *s = server->nextPendingConnection();
    //QString msg = "我是zpp";
    //s->write(msg.toLocal8Bit());
    //将客户端套接字放入到客户端容器中
    client_vector.push_back(s);

    //此时就可以完成一个服务器对应多个客户端
    //如果此时,当前客户端有消息发送到服务器中,那么该客户端会自动发送一个readyread信号
    //我们可以将该信号连接到自定义的槽函数中执行相关逻辑
    connect(s,&QTcpSocket::thread,this,&Widget::readyRead_slot);
}

//readyRead信号对应的槽函数
void Widget::readyRead_slot()
{
    //判断是哪个客户端发来消息
    for(int i=0;i<client_vector.size();i++)
    {
        //client_vector[i],表示的是任意一个客户端
        if(client_vector[i]->bytesAvailable()!=0)
        {
            //表示当前客户端有消息可读取
            QByteArray msg = client_vector[i]->readAll();

            //将QByteArray类型转换为QString类型
            QString msg_string = QString::fromLocal8Bit(msg);

            //将消息展示在ui界面上
            ui->msgwidget->addItem(msg_string);

            //将消息转发给所有客户端,无需转发自己
            for(int j=0;j<client_vector.size();j++)
            {
                if(i!=j)
                {
                    client_vector[j]->write(msg);
                }
            }

        }
    }
}

4> 思维导图


http://www.niftyadmin.cn/n/5852665.html

相关文章

无人机图像拼接数据在GIS中的处理与分析、可视化与制图;无人机航拍;无人机生态环境监测、图像处理与GIS数据分析

ArcGIS作为地理信息系统领域最主流的GIS平台软件&#xff0c;空间数据处理和分析功能强大&#xff0c;十分适用于地表空间监测数据的读写、管理、分析与可视化。本教程融合无人机生态环境监测技术和ArcGIS数据分析技术&#xff0c;通过具体案例分析与软件操作实践&#xff0c;详…

sql注入中information_schema被过滤的问题

目录 一、information_schema库的作用 二、获得表名 2.1 sys.schema_auto_increment_columns 2.2 schema_table_statistics 三、获得列名 join … using … order by盲注 子查询 在进行sql注入时&#xff0c;我们经常会使用information_schema来进行爆数据库名、表名、…

人工智能任务21-飞蛾火焰优化算法(MFO)在深度学习中的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能任务21-飞蛾火焰优化算法(MFO)在深度学习中的应用。飞蛾火焰优化算法&#xff08;Moth-Flame Optimization, MFO&#xff09;是一种受自然界中飞蛾向光源趋近行为启发的新型群体智能优化算法。在自然界中&a…

蓝桥杯篇---实时时钟 DS1302

文章目录 前言特点简介1.低功耗2.时钟/日历功能3.32字节的额外RAM4.串行接口 DS1302 引脚说明1.VCC12.VCC23.GND4.CE5.I/O6.SCLK DS1302 寄存器1.秒寄存器2.分钟寄存器3.小时寄存器4.日寄存器5.月寄存器6.星期寄存器7.年寄存器8.控制寄存器 DS1302 与 IAP25F2K61S2 的连接1.CE连…

通过操作系统中的IO模型理解Java中的BIO,NIO,AIO

操作系统中的三种IO模型 阻塞I/O 先来看看阻塞 I/O&#xff0c;当用户程序执行 read&#xff0c;线程会被阻塞 一直等到内核数据准备好&#xff0c;并把数据从内核缓冲区拷贝到应用程序的缓冲区中&#xff0c;当拷贝过程完成&#xff0c;read 才会返回 注意&#xff1a;阻塞…

提示词生成新方法,用Make自动化生成

提示词生成新方法&#xff01;用Make自动化生成&#xff01; 在当今快速发展的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;正在改变我们如何创作内容。然而&#xff0c;待人青睐的诀窍——提示词生成&#xff0c;可能令许多创作者感到迷惘。你是否曾在写作中挣扎…

【第3章:卷积神经网络(CNN)——3.5 CIFAR-10图像分类】

嘿,小伙伴们,今天咱们来聊聊一个超级酷炫的话题——卷积神经网络(CNN)及其在CIFAR-10图像分类中的应用。这不仅仅是一个技术话题,更是一场探索人工智能奥秘的旅程。准备好了吗?咱们这就发车! 一、CNN:人工智能的“千里眼” 首先,咱们得知道CNN是啥。CNN,全名Convol…

django中间件,中间件给下面传值

1、新建middleware.py文件 # myapp/middleware.py import time from django.http import HttpRequest import json from django.http import JsonResponse import urllib.parse from django.core.cache import cache from comm.Db import Db class RequestTimeMiddleware:def …