闹钟、绘制与TCP

news2024/12/28 23:35:18

闹钟

pro文件:

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTimer>
#include<QTime>
#include<QDebug>
#include<QTimerEvent>
#include<QDateTime>
#include<QTextToSpeech>
#include<QMessageBox>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void timerEvent(QTimerEvent *event);

private slots:
    void on_startBtn_clicked();

    void on_closeBtn_clicked();
    void updateTime();


private:
    Ui::Widget *ui;
    QTextToSpeech *speecher;
    QTimer *timer1;
    int clockTimerID;
    int eventTimerID;
};
#endif // WIDGET_H

源代码:

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    timer1 =new QTimer(this);

    speecher =new QTextToSpeech(this);
    connect(timer1,&QTimer::timeout,this,&Widget::updateTime);
    timer1->start(1000);
    updateTime();

}

Widget::~Widget()
{
    delete ui;
}
void Widget::updateTime()
{
    QTime sysTime =QTime::currentTime();
    QString t=sysTime.toString("hh:mm:ss");
    ui->timeLab->setText(t);
}

void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId()==clockTimerID)
    {
        if(ui->timeEdit->text()==ui->timeLab->text())
        {
            QString msg=ui->listenEdit->text();
            speecher->say(msg);
        }
    }
}

void Widget::on_startBtn_clicked()
{

    clockTimerID=this->startTimer(1000);
    ui->startBtn->setEnabled(false);
    ui->timeEdit->setEnabled(false);
}

void Widget::on_closeBtn_clicked()
{
    ui->timeEdit->setText("");
    this->killTimer(clockTimerID);
    ui->startBtn->setEnabled(true);
    ui->timeEdit->setEnabled(true);
}

聊天室的完善

客户端、服务器的pro文件:

客户端:

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>
#include<QMessageBox>

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_connectBtn_clicked();

    void connected_slot();

    void readyRead_slot();

    void on_sendBtn_clicked();

    void on_disconnectBtn_clicked();

    void disconnected_slot();

private:
    Ui::Widget *ui;

    QTcpSocket *client;

    QString userName;
};
#endif // WIDGET_H

源文件:

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化一个客户端对象
    client=new QTcpSocket(this);

    //
    connect(client,&QTcpSocket::connected,this,&Widget::connected_slot);

    //
    connect(client,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);

    connect(client,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}

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


void Widget::on_connectBtn_clicked()
{
    userName = ui->nameEdit->text();
    QString ip=ui->ipEdit->text();
    quint16 port =ui->portEdit->text().toUInt();

    client->connectToHost(ip,port);

    //程序执行至此,表示已经向多个服务器发送了连接请求如果连接成功服务器
    //那么该套接字就会自动发射一个connected的信号,我们可以将该信号连接到自定义的槽函数中处理逻辑
    //由于只需要连接一次,所以,可以写在构造函数中
}

void Widget::connected_slot()
{
    ui->nameEdit->setEnabled(false);
    ui->ipEdit->setEnabled(false);
    ui->portEdit->setEnabled(false);
    ui->connectBtn->setEnabled(false);
    QMessageBox::information(this,"提示","连接服务器成功");

    QString msg = userName +":进入聊天室";

    client->write(msg.toLocal8Bit());
}
void Widget::readyRead_slot()
{
    QByteArray msg =client->readAll();

    ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}


void Widget::on_sendBtn_clicked()
{
    QString msg =userName + ":" + ui->msgEdit->text();

    client->write(msg.toLocal8Bit());

    ui->msgEdit->clear();
}

void Widget::on_disconnectBtn_clicked()
{
    QString msg = userName +":离开聊天室";

    client->write(msg.toLocal8Bit());
    ui->nameEdit->setEnabled(true);
    ui->ipEdit->setEnabled(true);
    ui->portEdit->setEnabled(true);
    ui->connectBtn->setEnabled(true);

    client->disconnectFromHost();

}

void Widget::disconnected_slot()
{
    QMessageBox::information(this,"提示","客户端断开连接");
}

服务器:

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpServer>                     //服务器类
#include<QTcpSocket>                     //客户端类
#include<QList>                          //链表容器,用于存储连接过来的客户端
#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_serverBtn_clicked();

    void newConnection_slot();

    void readyRead_slot();

private:
    Ui::Widget *ui;

    //定义服务器指针
    QTcpServer *server;
    //定义客户端容器
    QList<QTcpSocket *> clientList;
};
#endif // WIDGET_H

源文件:

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化一个服务器对象
    server=new QTcpServer(this);
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}

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


void Widget::on_serverBtn_clicked()
{
    if(ui->serverBtn->text() == "启动服务器")
    {
        //获取ui界面上的端口号
        quint16 port =ui->portEdit->text().toUInt();
        //启动监听
        if(!server->listen(QHostAddress::Any,port))
        {
            QMessageBox::information(this,"提示","服务器启动失败");
            return ;
        }else
        {
            QMessageBox::information(this,"提示","服务器启动成功");
        }

        ui->portEdit->setEnabled(false);
        ui->serverBtn->setText("关闭服务器");
    }else if(ui->serverBtn->text()=="关闭服务器")
    {
        server->close();
        ui->portEdit->setEnabled(true);
        ui->serverBtn->setText("启动服务器");
    }
}

void Widget::newConnection_slot()
{
    //QMessageBox::information(this,"提示","有新客户发来连接请求");
    qDebug()<<"有新客服端发来请求";

    //获取最新连接的客户端套接字
    //函数原型:QTcpSocket *nextPendingConnection();
    //参数:无
    //返回值:最新连接的套接字地址
    QTcpSocket *s=server->nextPendingConnection();

    //将该套接字放入客户端链表
    clientList.push_back(s);

    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}

void Widget::readyRead_slot()
{
    //循环遍所有客户端,查看哪个客户端中有消息待读
    for(auto val:clientList)
    {
        //判断当前客户端中是否有消息待读
        //函数原型:qint64 bytesAvailable() const override;
        //参数:无
        //返回值:返回当前套接字中能被读取出来的字符个数
        if(val->bytesAvailable())
        {
            QByteArray msg=val->readAll();
            ui->listWidget->addItem(QString::fromLocal8Bit(msg));

            for(auto key:clientList)
            {
                key->write(msg);
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql-labs靶场第十五关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

65.DDR3读写控制器的设计与验证(2)

&#xff08;1&#xff09;写FIFO和读FIFO的配置 &#xff08;2&#xff09;AXI接口写入控制代码&#xff1a; module axi_master_write (//全局变量input wire ACLK , //全局时钟input wire ARESETN , …

AI工具推荐合集

在数字化时代&#xff0c;AI工具的出现极大地改变了我们的工作和生活方式。无论是学术研究、创意设计还是日常写作&#xff0c;这些工具都能提供强大的支持。以下是一些值得推荐的AI工具&#xff0c;帮助您提高效率与创造力。 1. 包阅AI 官网链接: 包阅AI 包阅AI是一款智能A…

哪吒汽车的工资到底发没发?

联网圈第一预言家&#xff0c;也就是美团的王兴&#xff0c;早在新能源热钱最多的那几年就预言&#xff0c;未来中国汽车格局大概率是「3333」。 也就是3家央企、3家地方国企、3家民企和3家新势力…… 此言论一出&#xff0c;当时可以说惹急了很多车企&#xff0c;比如已经退…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题&#xff08;180&#xff09; Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

ARINC 429总线协议

一、概述 ARINC 是美国航空无线电公司英文字头的缩写&#xff0c; 该公司1977年7月21日出版了“ARINC 429规范”一书&#xff0c;429规范就是飞机电子系统之间数字式数据传输的标准格式&#xff0c;在飞机上使用429总线的电子设备均应遵守这个规范&#xff0c;这样才能保证电子…

Debug-029-el-table实现自动滚动分批请求数据

前情提要 最近做了一个小优化&#xff0c;还是关于展示大屏方面的。大屏中使用el-table展示列表数据&#xff0c;最初的方案是将数据全部返回&#xff0c;确实随着数据变多有性能问题&#xff0c;有时请求时间比较长。这里做的优化就是实现列表的滚动到距离底部一定高度时再次请…

如何处理多频段时序特征?这个Transformer变体显著提升预测效果

Transformer 模型已在时间序列预测中展现了卓越的性能。然而&#xff0c;在一些复杂场景中&#xff0c;它倾向于学习数据中的低频特征&#xff0c;而忽略了高频特征&#xff0c;表现出一种频率偏差。这种偏差阻碍了模型准确捕捉重要的高频数据特征。 本文介绍一篇来自 KDD 202…

菜鸟笔记006 截图识别文字插件 textOCR

随手可得的截图识别文字插件 textOCR&#xff0c;识别出来的文字可直接输入到illustrator的当前文档中&#xff1a; 执行条件 1、需截图软件支持&#xff0c;推荐笔记截图工具 2、截好图片直接拖入面板即可完成识别 ****后期可完成实现在illustrator选择图片对象完成文字识别。…

Docker-Harbor概述及构建

文章目录 一、Docker Harbor概述1.Harbor的特性2.Harbor的构成 二、搭建本地私有仓库三、部署 Docker-Harbor 服务四、在其他客户端上传镜像五、维护管理Harbor 一、Docker Harbor概述 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅…

方波信号发生器(完整SCL源代码)

正弦和余弦信号发生器请参考下面文章链接: 1、博途PLC平台 PLC信号发生器(博途SCL)_博图软件波形发生器怎么用-CSDN博客文章浏览阅读1.1k次。本文介绍了如何使用博途SCL编程实现不同周期和幅值的信号发生器,包括余弦和正弦信号。通过信号发生器,可以用于验证PLC的滤波器效…

cesium模型加载

注意cesium版本&#xff1a; "three": "^0.168.0", 代码&#xff1a; <template><Layout :bg-color"black"><template #content><div id"cesiumContainers"><div id"cesiumContainer" class&q…

【C++】——二叉搜索树

目录 一、前言 二、二叉搜索树 2.1概念 2.2二叉搜索树操作 2.2.1 二叉树的查找 2.2.2 二叉搜索树的插入 2.2.3 二叉搜索树的删除 ​编辑 2.3二叉搜索树的实现 2.3.1查找 2.3.2 插入 2.3.3 删除 2.3.4 打印 2.3.5 拷贝构造和赋值重载 2.3.6 析构函数 2.4 二叉搜索…

智能去毛刺:2D视觉引导机器人如何重塑制造业未来

机器人技术已经深入到各个工业领域中&#xff0c;为制造业带来了前所未有的变革。其中&#xff0c;2D视觉引导机器人技术以其精准、高效的特点&#xff0c;在去毛刺工艺中发挥着越来越重要的作用。本文将为您介绍2D视觉引导机器人技术的基本原理及其在去毛刺工艺中的应用&#…

c++初阶数据结构速成

温馨提示&#xff1a;本篇文章只给大家介绍初阶数据结构的一些常用接口 stl的简单介绍 什么是stl? STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的 组件库&#xff0c;而且是一个包罗数据结构与算法的软件框…

Redis 哨兵模式下DB库操作审计

Redis Sentinel集群环境 主机版本模式NodeSentinelredis-sentinel-node-06.2.12哨兵MasterYesredis-sentinel-node-16.2.12哨兵SlaveYesredis-sentinel-node-26.2.12哨兵SlaveYes 架构设计 命令行&程序验证 1、在redis-sentinel-node-1上使用redis-cli 连接redis-sentine…

2024台州赛CTFwp

备注&#xff1a; 解题过程中&#xff0c;关键步骤不可省略&#xff0c;不可含糊其辞、一笔带过。解题过程中如是自己编写的脚本&#xff0c;不可省略&#xff0c;不可截图&#xff08;代码字体可以调小&#xff1b;而如果代码太长&#xff0c;则贴关键代码函数&#xff09;。…

开放式蓝牙耳机哪个品牌好用?开放式耳机排行榜测评!

开放式耳机&#xff0c;因其特殊的不入耳佩戴模式&#xff0c;让使用者在享受音乐或者进行通话的过程中&#xff0c;依然可以对外界声音保持敏感。在户外运动场景下&#xff0c;这种特性优势尽显&#xff0c;既保证了耳机佩戴的稳定和舒适&#xff0c;又提高了运动的安全性。为…

Netty结构

Netty结构 引导器Bootstrap举例&#xff1a;一个简单的HTTP服务器服务端启动类服务端业务逻辑处理类 二级目录Channel初始化&#xff08;设置Channel类型&#xff09;注册ChannelHandler结合HTTP请求-响应&#xff0c;分析数据在ChannelPipeline中的流向 设置Channel参数端口绑…