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);
复制代码
            }
复制代码
        }
复制代码
    }
复制代码
复制代码
}
复制代码
相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00615 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术15 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript