QT DAY6

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);socket = new QTcpSocket(this);//如果连接服务器成功,该客户端就会发射一个connected的信号。//我们可以将信号连接到自定义的槽函数中处理相关逻辑//由于该链接只需连接一次,所以卸载构造函数中即可connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//客户端与服务器连接后,如果服务器想客户端发来数据,那么该客户端就会自动发送一个readRead信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}void Widget::on_connectBtn_clicked()
{//获取ui界面的信息userName = ui -> usernameEdit -> text();QString hostName = ui -> ipEdit -> text();quint16 port = ui -> portEdit ->text().toUInt();//调用函数连接到主机socket -> connectToHost(hostName,port);ui ->ipEdit -> setEnabled(false);ui ->portEdit -> setEnabled(false);ui ->connectBtn -> setEnabled(false);ui ->usernameEdit -> setEnabled(false);
}void Widget::connected_slot(){QMessageBox::information(this,"成功","连接服务器成功");QString msg = userName +"进入聊天室";socket -> write(msg.toLocal8Bit());
}void Widget::readyRead_slot(){//读取该客户端信号对应槽函数的实现QByteArray msg = socket ->readAll();ui -> msgList -> addItem(QString::fromLocal8Bit(msg));}void Widget::on_sendBtn_clicked()
{QString m = ui ->msgEdit ->text();QString msg = userName + ":"+m;socket -> write(msg.toLocal8Bit());ui -> msgEdit -> clear();}//断开服务器按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{QString msg = userName + ":离开聊天室";socket -> write(msg.toLocal8Bit());//调用成员函数disconnectFromHost//功能:断开客户端与服务器的连接socket -> disconnectFromHost();//当客户端与服务器断开连接后,该客户端就会发射一个disconnected的信号//我们可以将该信号与自定义的槽函数连接ui ->ipEdit -> setEnabled(true);ui ->portEdit -> setEnabled(true);ui ->connectBtn -> setEnabled(true);ui ->usernameEdit -> setEnabled(true);
}void Widget::disconnected_slot(){QMessageBox::information(this,"退出","断开成功");
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity制作下雨中的地面效果

Unity引擎制作下雨效果 大家好,我是阿赵。   之前介绍了Unity引擎里面通过UV偏移做序列帧动画的做法,这里再介绍一个进阶的用法,模拟地面下雨的雨点效果。 一、原理 最基本的原理,还是基于这个序列帧动画的做法。不过这里做一点…

【ES6】require、export和import的用法

在JavaScript中,require、export和import是Node.js的模块系统中的关键字,用于处理模块间的依赖关系。 1、require:这是Node.js中引入模块的方法。当你需要使用其他模块提供的功能时,可以使用require关键字来引入该模块。例如&…

Python之父加入微软三年后,Python嵌入Excel!

近日,微软传发布消息,Python被嵌入Excel,从此Excel里可以平民化地进行机器学习了。只要直接在单元格里输入“PY”,回车,调出Python,马上可以轻松实现数据清理、预测分析、可视化等等等等任务,甚…

陶氏公司将出席2023第二届中国汽车碳中和峰会

2023第二届中国汽车碳中和峰会将于10月19日-20日在上海举办。 本次峰会将为行业领导者、政策制定者和专家提供一个平台,讨论汽车行业减少碳排放的策略。专家们将从政策、供应链、ESG、替代能源解决方案、汽车材料创新、法律等不同领域分享碳中和与可持续策略。 通…

Java 几个基本数据类型长度

对 Java 来说,我们通常会有下面几个基本数据类型。 需要了解的一个定义是,一个字节(byte) 是 8 位(Bit)。 针对 Java 的所有数据类型,最小的是 1 个字节,最多的是 8 个字节 数据长…

C++的继承

1.继承的基本形式 1.还是举每次讲继承都会举得一个例子:老师和学生都有人类的共同信息----姓名,性别,身份证等等,而学生有学工号,课表。老师有上班时间等等,所以在类中就有了继承这一说,子类继…

vscode新建vue3文件模板

输入快捷新建的名字 enter 确认后在文件中输入以下内容 {// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and// description. The prefix is what is used to trigger the snippet and the body will be expand…

蚂蚁集团SQLess 开源,与内部版有何区别?

当我们使用关系型数据库时,SQL 是联系起用户和数据库的一座桥梁。 SQL 是一种高度非过程化的语言,当我们在编写SQL 时,表达的是想要什么数据,而不是怎么获取数据。因此,我们往往更关心SQL 有没有满足业务逻辑&#xff…

二叉树的前序遍历

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 二叉树的前序遍历 题目要求 题目链接 示例 解答 方法一、 递归法 实现思路 使用递归依次将该结点的数据,该结点的左子树的数据&am…

vue3 封装千分位分隔符自定义指令

toLocaleString作用:在没有指定区域的基本使用时,返回使用默认的语言环境和默认选项格式化的字符串。可点击进入MDN查看 // 千分位分隔符指令 import { Directive, DirectiveBinding } from vueconst thousandSeparator: Directive {mounted(el: any, …

git中的cherry-pick和merge有些区别以及cherry-pick怎么用

git中的cherry-pick和merge在使用场景上有些区别: cherry-pick用于将另一个分支的某一次或几次commit应用到当前分支。它可以选择性地拉取代码修改。merge用于将两个分支合并成一个新分支。它会把整个分支上的所有修改都合并过来。 具体区别:cherry-pick通常用于将bug修复从发…

QT中闹钟的设置

.h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮 #include <QTextEdit> //文本 #include <QLabel> //标签 #include <QLineEdit> //行编辑器#include <QTimerEvent> //定时器事件类头文件 #…