2024.5.10

TCP服务器端 

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口大小和窗口大小固定this->resize(727,879);this->setFixedSize(727,879);//创建文本列表类对象list = new QListWidget(this);list->resize(680,550);list->move(20,80);//创建输入框line = new QLineEdit(this);line->resize(680,80);line->move(20,680);line->setPlaceholderText("请输入端口号");//创建发送按钮btn1 = new QPushButton("启动聊天室",this);btn1->resize(300,50);btn1->move(210,800);//创建聊天室名QLabel *chat_lab = new QLabel(this);chat_lab->resize(680,60);chat_lab->move(20,10);//实例化一个服务器端ser = new QTcpServer(this);//建立信号与槽//按钮开启服务器connect(btn1,&QPushButton::clicked,this,&Widget::btn1_slot);connect(ser,&QTcpServer::newConnection,this,&Widget::newconnect_slot);}Widget::~Widget()
{delete ui;
}void Widget::btn1_slot()
{if(btn1->text() == "启动聊天室"){//开启服务器端监听//获取文本框内输入的端口号quint16 port = line->text().toUInt();if(ser->listen(QHostAddress::Any,port)){QMessageBox::information(this,"提示","启动聊天室成功");}else{QMessageBox::warning(this,"提示","启动聊天室失败");}//设置文字为关闭聊天室btn1->setText("关闭聊天室");}else{//关闭服务器端ser->close();//设置文字开启聊天室btn1->setText("启动聊天室");}
}//处理信号newconnect的槽函数
void Widget::newconnect_slot()
{//接收客户端端口号QTcpSocket *socket = ser->nextPendingConnection();//将客户端消息存入链表cliList.append(socket);//连接客户端的信号和槽函数connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);}//准备readyRead信号的槽函数
void Widget::readyRead_slot(){//判断链表中是否有客户端已经退出,有则删除for(int i=0;i<cliList.length();i++){if(cliList[i]->state() == QTcpSocket::UnconnectedState){cliList.removeAt(i);}//判断链表中是否有消息for(int i=0;i<cliList.length();i++){if(cliList[i]->bytesAvailable() != 0){QByteArray msg = cliList[i]->readAll();//将读取到的消息发送到ui界面list->addItem(QString::fromLocal8Bit(msg));//将读取到的消息发送给客户端for(int j=0;j<cliList.length();j++){if(j!=i){cliList[j]->write(msg);}}}}}
}

 

客户端 

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口大小和窗口大小固定this->resize(727,879);this->setFixedSize(727,879);//创建文本列表类对象list = new QListWidget(this);list->resize(500,550);list->move(20,80);//创建输入框text = new QTextEdit(this);text->resize(500,100);text->move(20,680);//创建发送按钮btn1 = new QPushButton("发送",this);btn1->resize(120,50);btn1->move(400,800);//实例化链接按钮link_btn = new QPushButton("连接服务器",this);link_btn->resize(150,60);link_btn->move(530,570);//实例化文本lab1 = new QLabel("用户名",this);lab1->resize(150,50);lab1->move(530,80);lab1->setText("用户名");line1 = new QLineEdit(this);line1->resize(150,60);line1->move(530,150);lab2 = new QLabel("IP地址",this);lab2->resize(150,50);lab2->move(530,230);lab2->setText("IP地址");line2 = new QLineEdit(this);line2->resize(150,60);line2->move(530,300);lab3 = new QLabel("端口号",this);lab3->resize(150,50);lab3->move(530,380);line3 = new QLineEdit(this);line3->resize(150,60);line3->move(530,450);//接收聊天室名的标签chat_lab = new QLabel(this);chat_lab->resize(500,80);//实例化客户端对象cli = new QTcpSocket(this);//链接函数connect(btn1,&QPushButton::clicked,this,&Widget::chat_btn_slot);connect(link_btn,&QPushButton::clicked,this,&Widget::link_btn_slot);connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);}Widget::~Widget()
{delete ui;
}void Widget::chat_btn_slot()
{//发送消息QString msg = userName + ":" + text->toPlainText();cli->write(msg.toLocal8Bit());//清空text->clear();//发给自己的uiQListWidgetItem *item = new QListWidgetItem(msg);item->setTextAlignment(Qt::AlignRight);list->addItem(item);
}void Widget::link_btn_slot()
{if(link_btn->text() == "连接服务器"){//连接服务器userName = line1->text();QString ip = line2->text();quint16 port = line3->text().toUInt();cli->connectToHost(ip,port);//设置文字为断开link_btn->setText("断开服务器");}else{//断开服务器QString msg = userName + ": 已下线";cli->write(msg.toLocal8Bit());cli->disconnectFromHost();//设置文字为连接link_btn->setText("连接服务器");}}void Widget::connected_slot(){QMessageBox::information(this,"提示","连接成功");
}void Widget::readyRead_slot(){//接收到服务器端消息QString msg = cli->readAll();list->addItem(msg.toLocal8Bit());}

 

 数据库实现

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口大小this->resize(700,700);//设置按钮1,2,3,4btn1 = new QPushButton("增加",this);btn1->resize(120,80);btn1->move(100,200);btn4 = new QPushButton("查看",this);btn4->resize(120,80);btn4->move(500,200);//设置文本框输入学号和姓名line1 = new QLineEdit(this);line1->resize(150,80);line1->move(100,100);line2 = new QLineEdit(this);line2->resize(150,80);line2->move(350,100);//实例化表格table = new QTableWidget(this);table->resize(400,300);table->move(150,300);table->setRowCount(5);table->setColumnCount(2);//判断当前数据库操作对象是否包含了数据库if(!db.contains("mydb.db")){db = QSqlDatabase::addDatabase("QSQLITE");//给数据库设置名字db.setDatabaseName("mydb.db");//打开数据库if(!db.open()){QMessageBox::information(this,"提示","数据库打开失败");}}//准备sql语句QString sql = "create table if not exists Stu(numb int,name char)";QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","创建数据表失败");}connect(btn1,&QPushButton::clicked,this,&Widget::sql_slot);connect(btn4,&QPushButton::clicked,this,&Widget::sql_slot2);}Widget::~Widget()
{delete ui;
}//相应按钮1,存入数据表槽函数
void Widget::sql_slot()
{//准备sql语句//将ui界面上的相关消息拿下来int ui_numb = line1->text().toUInt();QString ui_name = line2->text();if(ui_numb == 0 || ui_name == NULL){QMessageBox::information(this,"提示","请填写完整");return ;}QString sql = QString("insert into Stu values(%1,'%2')").arg(ui_numb).arg(ui_name);QSqlQuery query;if(query.exec(sql)){QMessageBox::information(this,"","成功0");}else{QMessageBox::information(this,"","失败");}
}//相应按钮2,查看数据库槽函数
void Widget::sql_slot2()
{QString sql;if(line2->text() ==NULL){sql = "select * from Stu";}else{sql = QString("select * from Stu where name = '%1'").arg(line2->text());}QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"","失败");}//将结果展示到uiint i=0;while(query.next()){for(int j=0;j<query.record().count();j++){QTableWidgetItem *item = new QTableWidgetItem(query.record().value(j).toString());table->setItem(i,j,item);}i++;}
}

 

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

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

相关文章

STC8增强型单片机开发【定时器Timer⭐】

目录 一、引言 二、定时器基础知识 三、STC8定时器配置 四、代码示例 五、总结 一、引言 在单片机开发中&#xff0c;定时器&#xff08;Timer&#xff09;是一个极其重要的组件&#xff0c;它允许开发者基于时间触发各种事件或任务。STC8增强型单片机作为一款功能丰富的…

使用2G内存求20亿个数字中出现次数最多的N个

又是一个TOP -N的题目 我看了一下CSDN上大多数人的回答和GPT说的差不多&#xff0c;都是说使用哈希之类的&#xff1b; 我今天说一下我的解法&#xff0c;首先说一下不太快的基础解法 20亿数字使用uint32需要80GB&#xff0c; &#xff08;1&#xff09;分为40块读取&#…

c++opencv Project3 - License Plate Detector

俄罗斯车牌识别案例&#xff1a;实时识别车牌&#xff0c;并且读取到指定文件夹中。 惯例先展示结果图&#xff1a; 对于摄像头读取图片进行车牌匹配&#xff0c;原理和人脸识别其实是一致的。 利用训练好的模型进行匹配即可。可参考&#xff1a; 对视频实现人脸识别-CSDN博…

电能表远程抄表系统是什么?

电能表远程抄表系统是一种优秀的电力管理方法&#xff0c;它通过自动化的形式搜集、解决与分析电能表的信息&#xff0c;进而取代了传统人工抄水表方法。其主要原理是运用物联网技术、通讯技术和大数据处理技术&#xff0c;完成对电度表数据信息实时、远程控制获取和管理方法。…

探索无界知识:用 ChatGPT 的原理学习任何事物!

为避免文章重复&#xff0c;您的文本已通过更改句式、用词以及句子结构进行了修改。现在的文本应该能更好地满足去重的需求&#xff1a; 从ChatGPT原理出发&#xff0c;我们探讨GPT如何启发人类学习和构建个人知识体系。 1. 明确学习目标 机器学习必须依靠目标函数。同样&…

【Qt 开发基础体系】QMap 类和 QHash 类以及 QVector 类

文章目录 1.QMap 详解1.1 QMap 的介绍1.2 QMap 的具体用法如下1.3 QmultiMap类 2.QHash 详解3. QMap 和 QHash 的对比4. QVector 详解 1.QMap 详解 1.1 QMap 的介绍 &#x1f427;① QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的…

STC8增强型单片机开发【串口调试UART⭐⭐】

目录 一、引言 二、UART基础知识 三、STC8 UART配置 四、代码示例 上列代码中所需的库函数文件&#xff1a; 引入库函数的流程&#xff1a; 五、总结 一、引言 在单片机开发中&#xff0c;串口调试&#xff08;UART&#xff09;是一种常用的通信方式&#xff0c;用于实现…

linux grep命令搜索指定路径

在Linux开发的过程中grep这个搜索命令&#xff0c;是必不可少的存在。它可以快速的搜索出来我们需要的关键字所在的位置。 有助于我们快速分析定位问题。 下面&#xff0c;分享一个简单实用的小技巧。 原始grep 最终grep grep过滤掉二进制的文件 -I选项 结论 这样子是不…

126.删除链表的倒数第N个节点(力扣)

题目描述 代码解决&#xff08;双指针&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, Li…

全视通助力珠海市井岸镇卫生院新院,建设智慧病房

5月6日&#xff0c;位于珠海市斗门区的井岸镇卫生院新院正式启用&#xff0c;面向市民开诊。新院各诊区就医秩序井然&#xff0c;总体情况良好。据统计&#xff0c;截至开诊当天11点30分&#xff0c;新院门诊共接诊347人次&#xff0c;预防接种81人次&#xff0c;儿童体检33人次…

网络相关笔记

IPv4地址 IPv4地址通常以“点分十进制”形式书写&#xff0c;即四个0-255之间的十进制数&#xff0c;各数之间用英文句点&#xff08;.&#xff09;分隔&#xff0c;例如&#xff1a;192.0.2.1。总共32位的地址空间可以表示大约42亿个不同的地址。 IPv4地址结构包括&#xff…

HashSet扩容机制

HashSet底层是HashMap,第一次添加的时候,table数组扩容到16,临界值是16*加载因子(默认是0.75),到达临界值进行扩容。 HashSet<Integer> hashSet = new HashSet<>();hashSet.add(5);hashSet.add(2);hashSet.add(5);hashSet.add(8);hashSet.add(1);当new一个H…

【C++STL详解(十)】--------priority_queue的模拟实现

目录 前言 一、堆的向上调整算法 二、堆的向下调整算法 三、优先队列模拟实现 Ⅰ、接口总览 Ⅱ、各个接口实现 1.构造函数 2.仿函数 3.向上调整 4.向下调整 5.其余接口 Ⅲ、完成代码 前言 上节内容我们简单的介绍了关于priority_queue的使用内容&#xff0c;我们明白…

Baidu Comate 编程插件:提升开发效率的利器

文章目录 引言简介目的 Baidu Comate插件概述定义与功能市场现状竞品分析 安装与配置VsCode 安装&#xff1a;注意事项 版本选择 核心特性详解功能介绍代码生成实时续写错误纠正 使用体验体验地址 引言 简介 基于文心大模型&#xff0c;结合百度积累多年的编程现场大数据和外…

PDF批量编辑:PDF转HTML批量操作技巧,提升文档格式转换效率

在数字化办公日益普及的今天&#xff0c;PDF&#xff08;Portable Document Format&#xff09;作为一种跨平台的文件格式&#xff0c;广泛应用于各种文档的存储和传输。然而&#xff0c;PDF文件的不可编辑性使得在某些情况下&#xff0c;我们需要将其转换为HTML格式以便更好地…

【国产SSL】哪家SSL证书可以保证数据不出境,是在国内验签

随着网络安全的重视&#xff0c;网站安装SSL证书已经是标配了。但是为什么目前常见的SSL证书都是国外的&#xff1f;数据受国外掌控&#xff0c;安全吗&#xff1f;那么哪家国产品牌是可以保证数据不出境的呢&#xff1f; 为什么目前常见的SSL证书都是国外的&#xff1f; 原因…

Java苍穹外卖05-订单状态定时处理-数据统计-导出excel

一、订单状态定时处理 1.Spring Task ①介绍 应用场景&#xff1a; ②cron表达式 https://cron.qqe2.com/ ③入门案例 2.需求分析 3.代码开发 每一分钟检查是否存在超时15分钟的订单 每天凌晨一点处理上一条处于派送中的订单 mapper&#xff1a; 二、来单提醒、客户催单 1…

手撕C语言题典——移除链表元素(单链表)

目录 前言 一.思路 1&#xff09;遍历原链表&#xff0c;找到值为 val 的节点并释放 2&#xff09;创建新链表 二.代码实现 1)大胆去try一下思路 2&#xff09;竟然报错了&#xff1f;&#xff01; 3&#xff09;完善之后的成品代码 搭配食用更佳哦~~ 数据结构之单…

CellChat包文献介绍

Inference and analysis of cell-cell communication using CellChat - PubMed (nih.gov) 目录 在线数据 摘要 基础介绍 分析结果 1&#xff0c;概述 2&#xff0c;识别预测通路 3&#xff0c;连续的信号转导 4&#xff0c;预测空间共定位细胞群之间的关键信号转导事件…

Al Agent:开启智能化未来的关键角色,让机器更智能的为我们服务

文章目录 &#x1f680;Al Agent是什么&#x1f4d5;Al Agent的工作原理与技术&#x1f4aa;Al Agent应用领域&#x1f680;智能家居应用&#x1f308;医疗健康领域⭐金融服务行业&#x1f302;交通运输管理&#x1f3ac;教育培训应用 &#x1f512;Al Agent优势与挑战✊Al Age…