QT学习第五天

embedded/2024/10/21 12:00:49/
#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , socket(new QTcpSocket(this))
{
    ui->setupUi(this);
    //初始化页面
    ui->mag_edit->setEnabled(false);
    ui->send_btn->setEnabled(false);
    ui->dis_btn->setEnabled(false);
    //
    connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
    //如果服务器向客户端发送数据,那么客户端就会自动发射一个readyread()信号
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
 
}
 
Widget::~Widget()
{
    delete ui;
}
 
 
void Widget::on_connect_btn_clicked()
{
    QString ip = ui->ip_edit->text();
    quint16 port = ui->port_edit->text().toUInt();
 
    socket->connectToHost(ip,port);
 
 
}
 
void Widget::connected_slot()
{
    QString userName = ui->user_edit->text();
    //告诉服务器我来了
    QString msg = userName + ":进入聊天室";
    //将信息发送给服务器
    socket->write(msg.toLocal8Bit());
 
    ui->mag_edit->setEnabled(true);
    ui->send_btn->setEnabled(true);
    ui->dis_btn->setEnabled(true);
 
    ui->user_edit->setEnabled(false);
    ui->ip_edit->setEnabled(false);
    ui->port_edit->setEnabled(false);
    ui->connect_btn->setEnabled(false);
 
 
}
 
void Widget::on_send_btn_clicked()
{
    //获取ui界面的文本
    QString msg =ui->mag_edit->text();
    msg = userName + ":" + msg;
    //将信息发生给服务器
    socket->write(msg.toLocal8Bit());
    //清空
    ui->mag_edit->clear();
}
void Widget:: readyRead_slot()
{
    QByteArray msg = socket->readAll();
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));
 
}
 
void Widget::disconnected_slot()
{
    ui->mag_edit->setEnabled(false);
    ui->send_btn->setEnabled(false);
    ui->dis_btn->setEnabled(false);
 
    ui->user_edit->setEnabled(true);
    ui->ip_edit->setEnabled(true);
    ui->port_edit->setEnabled(true);
    ui->connect_btn->setEnabled(true);
 
 
}
 
 
void Widget::on_dis_btn_clicked()
{
    //告诉服务器我要走了
    QString msg = userName + ":离开聊天室";
    socket->write(msg.toLocal8Bit());
    socket->disconnectFromHost();
 
}

服务器

#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , server(new QTcpServer(this))//给服务器指针实例化空间
{
    ui->setupUi(this);
}
 
Widget::~Widget()
{
    delete ui;
}
 
 
 
void Widget::on_start_btn_clicked()
{
    quint16 port = ui->port_edit->text().toUInt();
    if(server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"","启动服务器成功!");
    }
    else
    {
        QMessageBox::information(this,"","启动服务器失败!");
        return;
    }
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
 
}
 
void Widget::newConnection_slot()
{
    qDebug()<<"有新的客户端连接";
 
    QTcpSocket *s = server->nextPendingConnection();
 
    socketList.push_back(s);
 
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
 
}
 
void Widget::readyRead_slot()
{
    for(int i=0;i<socketList.count();i++)
    {
        if(socketList.at(i)->state()==0)
        {
            //移除无效客户端
            socketList.removeAt(i);
        }
    }
    //遍历客户端容器判断哪个客户端有数据待读
    for(int i=0;i<socketList.count();i++)
    {
        //判断哪个客户端有数据待读
        if(socketList.at(i)->bytesAvailable()!=0)
        {
            //读取数据
            QByteArray msg = socketList.at(i)->readAll();
 
            //将读取到的数据放到ui界面上
            ui->listWidget->addItem(QString::fromLocal8Bit(msg));
 
            //将数据广播给所有客户端
            for(int j=0;j<socketList.count();j++)
            {
                socketList.at(j)->write(msg);
            }
        }
    }
 
}

http://www.ppmy.cn/embedded/111380.html

相关文章

Serverless 安全新杀器:云安全中心护航容器安全

作者&#xff1a;胡志广(独鳌) 云安全中心对于 Serverless 容器用户的价值 从云计算发展之初&#xff0c;各大云厂商及传统安全厂商就开始围绕云计算的形态来做安全解决方案。传统安全与云计算安全的形态与做法开始发生变化&#xff0c;同时随着这 10 多年的发展&#xff0c;…

python如何加速计算密集型任务2?

问题描述&#xff1a; 在python中&#xff0c;有一个函数&#xff0c;其功能是进行某种计算&#xff0c;需要传入一些参数&#xff0c;计算完成后传回结果&#xff0c;参数是a,b,c,d,分别从列表中取值&#xff0c;返回值是xx,yy,分别是一个列表&#xff0c;调用其一次大概要1s…

03 Flask-添加配置信息

回顾之前学习的内容 02 Flask-快速上手 Flask 中最简单的web应用组成 1. 导入核心库 Flask from flask import Flask2. 实例化 web应用 注意&#xff1a;不要漏了 app Flask(__name__) 中的 __name__ 表示&#xff1a;是从当前的py文件实例化 app Flask(__name__)3. 创…

计算机视觉硬件知识点整理(三):镜头

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、镜头的基础知识与类型二、镜头知识点总结&#xff1a;2.1 光圈2.2 景深2.3 调制传递函数&#xff1a;2.4 视场角2.5 焦距2.6 滤光片 前言 在这个信息化飞速…

Vue 2 生命周期详解

Vue 2 的生命周期是指 Vue 实例从创建到销毁的整个过程。在这个过程中&#xff0c;Vue 提供了多个生命周期钩子&#xff0c;允许我们在不同阶段执行代码。以下是 Vue 2 生命周期的详细解析&#xff1a; 1. 创建阶段 (Creation) beforeCreate: 在实例初始化之后&#xff0c;数…

Llama Factory :百种以上语言模型的统一高效微调框架

人工智能咨询培训老师叶梓 转载标明出处 大模型适应到特定下游任务时&#xff0c;传统的全参数微调方法成本高昂&#xff0c;因此&#xff0c;研究者们一直在探索更高效的微调技术。由北京航空航天大学和北京大学的研究团队提出了一个名为Llama Factory的统一框架&#xff0c;…

数据结构——单链表基本操作的实现

前言 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》29 ~ 36页 注意 这里的ElemType是以Book类型的数据作为举例&#xff0c;如果需要更改可以自行改变&#xff01; &#x1f308;每一个清晨&#xff0c;都是世界对你说的最温柔的早安&#xff…

在docker中安装 zendesk/maxwell 失败,解决方法

文章目录 1、拉取镜像失败2、一键设置镜像加速&#xff1a;修改文件 /etc/docker/daemon.json&#xff08;如果不存在则创建&#xff09;3、保存好之后 执行以下两条命令 1、拉取镜像失败 [rootlocalhost docker]# docker pull zendesk/maxwell Using default tag: latest Err…