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

QT学习第五天

#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.kler.cn/a/305219.html

相关文章:

  • 软件测试面试2024最新热点问题
  • ElasticSearch学习笔记一:简单使用
  • ISAAC SIM踩坑记录--ubuntu 22.04操作系统安装
  • 【AI换装整合包及教程】CatVTON与其他虚拟试衣技术的详细对比
  • 鸿蒙next版开发:ArkTS组件通用属性(Z序控制)
  • 力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
  • mysql workbench 如何访问远程数据库
  • 快手手撕 力扣2487 从链表中移除节点 单调栈 递归
  • HTTP 请求方式`application/x-www-form-urlencoded` 与 `application/json` 怎么用?有什么区别?
  • C++编译环境(IDE)推荐及安装
  • 美国硅谷大带宽服务器带宽堵塞解决方案
  • Oracle发邮件功能:设置的步骤与注意事项?
  • 【Oracle】TIMESTAMP类型时间计算时间差
  • SprinBoot+Vue宠物共享平台的设计与实现
  • 性能诊断的方法(五):架构和业务诊断
  • 前端下载word、excel文件的两种方法
  • [数据集汇总]智慧交通-铁路相关数据集汇总
  • dedecms靶场(四种webshell姿势)
  • JMeter 入门之远程启动,服务模式,多机联测,负载均衡测试
  • 基于python+django+vue+MySQL的酒店推荐系统
  • Golang | Leetcode Golang题解之第396题旋转函数
  • 数据结构C //线性表(链表)ADT结构及相关函数
  • Qt与MQTT交互通信
  • 探索音视频SDK的双重核心:客户端与服务端的协同作用
  • 裸金属服务器与云服务器的区别有哪些?
  • 选择合适的工业制造营销代理机构:应关注哪些方面