qt作业day5

复制代码
//客户端,





#include "tcpcli.h"
#include "ui_tcpcli.h"

TcpCli::TcpCli(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TcpCli)
{
    ui->setupUi(this);
    //给客户端指针实例化对象
    cli_sock = new QTcpSocket(this);
    ui->discntBtn->setEnabled(false);
//    ui->lineEdit->setEnabled(false);
    ui->pushButton->setEnabled(false);
    connect(cli_sock,&QTcpSocket :: connected,this,&TcpCli :: connected_slot);

    
    connect(cli_sock,&QTcpSocket :: readyRead,this,&TcpCli :: readyRd_slot);


    connect(cli_sock,&QTcpSocket :: disconnected,this,&TcpCli :: disconnected_slot);
}

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

//重写键盘事件
void TcpCli::keyPressEvent(QKeyEvent *event)
{

    if(event->text() == "\r")
    {
        if(connectState != 1)
        {
            QMessageBox :: critical(this,"错误","未连接服务器");
            return;
        }
        if(ui->lineEdit->text() == "")
        {
            QMessageBox :: warning(this,"警告","输入不能为空");
            return;
        }
        QString msg = usr_name + ":" + ui->lineEdit->text();
        cli_sock->write(msg.toLocal8Bit());
        ui->lineEdit->clear();
    }
}

//连接服务器
void TcpCli::on_connectBtn_clicked()
{
    //获取ui界面的信息
    usr_name = ui->usrNameEdit->text();
    QString hostName = ui->ipEdit->text();
    quint16 port = ui->portEdit->text().toUInt();

    

    cli_sock->connectToHost(hostName,port);



}

void TcpCli::connected_slot()
{
    ui->ipEdit->setEnabled(false);
    ui->portEdit->setEnabled(false);
    ui->pushButton->setEnabled(true);
    ui->connectBtn->setEnabled(false);
    ui->usrNameEdit->setEnabled(false);
    ui->discntBtn->setEnabled(true);
    QMessageBox :: information(this,"信息","连接服务器成功");
    connectState = 1;
    //向服务器发送信息
    QString msg = usr_name + ":进入聊天室";
    cli_sock->write(msg.toLocal8Bit());

}


//关于readyRead信号对应槽函数的实现
void TcpCli::readyRd_slot()
{
    //读取该客户端中的数据
    QByteArray msg = cli_sock->readAll();
    ui->listWidget->addItem(QString :: fromLocal8Bit(msg));

}


//
void TcpCli::on_pushButton_clicked()
{
    QString msg = usr_name + ":"+ ui->lineEdit->text();
    cli_sock->write(msg.toLocal8Bit());

    //将消息编辑框中的内容清空
    ui->lineEdit->clear();

}


//断开连接按钮对应的槽函数
void TcpCli::on_discntBtn_clicked()
{
    //准备要发送的信息
    QString sndmsg = usr_name + ":离开聊天室";
    cli_sock->write(sndmsg.toLocal8Bit());




    cli_sock->disconnectFromHost();

    ui->ipEdit->setEnabled(true);
    ui->portEdit->setEnabled(true);
    ui->usrNameEdit->setEnabled(true);
    ui->connectBtn->setEnabled(true);
    ui->discntBtn->setEnabled(false);
    ui->pushButton->setEnabled(false);
    connectState = 0;
 

}

void TcpCli::disconnected_slot()
{

    QMessageBox :: information(this,"退出","断开成功");
}

//服务器,源文件
#include "tcpser.h"
#include "ui_tcpser.h"

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

    //给服务器指针实例化对象
    server = new QTcpServer(this);

    speech = new QTextToSpeech(this);

}

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


//启动服务器按钮对应的槽函数
void TcpSer::on_pushButton_clicked()
{
    //获取ui界面上的端口号
    quint16 port = ui->lineEdit->text().toUInt();


    
    if(!server->listen(QHostAddress :: Any,port))
    {
        QMessageBox :: critical(this,"错误","服务器启动失败",QMessageBox :: Ok,QMessageBox :: Ok);
        return;
    }
    else
    {
        QMessageBox :: information(this,"信息","启动成功");
        connect(server,&QTcpServer :: newConnection,this,&TcpSer :: newCnt_slot);
    }



}


//自定义处理newConnection信号的槽函数实现
void TcpSer::newCnt_slot()
{
    speech->setVoice(QVoice());
    speech->say("咳咳咳");



    QTcpSocket *sock = server->nextPendingConnection();
    cli_list.push_back(sock);

    
    connect(sock,&QTcpSocket :: readyRead,this,&TcpSer :: rdyRead_slot);
}


//
void TcpSer::rdyRead_slot()
{
    //删除客户端链表中的无效客户端套接字
    for(int i = 0;i < cli_list.size();i++)
    {
        //判断套接字的状态

       
        if(0 == cli_list[i]->state())
        {
            
            cli_list.removeAt(i);
        }
    }
        for(int i = 0;i < cli_list.count();i++)
        {
           

            if(cli_list[i]->bytesAvailable() != 0)
            {
              
                QByteArray msg = cli_list[i]->readAll();


                //将数据展示到ui界面上
                ui->listWidget->addItem(QString :: fromLocal8Bit(msg));

                //将接收到的信息发送给所有客户端
                for(int j = 0;j < cli_list.count();j++)
                {
                    cli_list[j]->write(msg);
                }
            }
        }



}

运行效果:服务器端,开启后

相关推荐
小咕聊编程38 分钟前
基于Python的豆瓣电影数据可视化系统构建分析
开发语言·python·信息可视化
脏脏a2 小时前
延迟与画质:远程控制的生命线
开发语言·php
像风一样的男人@3 小时前
python --基于scp的文件传输助手
开发语言·python
一条破秋裤3 小时前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
m0_639906943 小时前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
Evand J3 小时前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa
GIS数据转换器3 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts
weixin_417396833 小时前
星级酒店境外电视频道怎么合法接入?合规要点与核对清单
开发语言·前端·php·1024程序员节·综合布线
熊猫钓鱼>_>3 小时前
鸿蒙PC构建实战:hvigor modelVersion 降级 + schema 清理 + ArkTS 编译三连坑完整复盘
开发语言·华为·ai编程·harmonyos·openharmony·数据·ai生成
FRing034 小时前
JavaScript入门到精通三十一(原型继承、原型链)
开发语言·前端·javascript