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,一经查实,立即删除!

相关文章

2024- 人工智能药物设计- AIDD- 胶质母细胞瘤的相关论文研究

胶质母细胞瘤的相关论文研究 1. 胶质母细胞瘤的相关的论文 Natural Small Molecules Targeting NF-κB Signaling in Glioblastoma: This review discusses the role of NF-κB signaling in glioblastoma and highlights natural small molecules that can interfere with t…

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块读取&#…

Vue.js 组件 - 自定义事件

父组件是使用 props 传递数据给子组件&#xff0c;但如果子组件要把数据传递回去&#xff0c;就需要使用自定义事件&#xff01; 我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface)&#xff0c;即&#xff1a; 使用 $on(eventName) 监听事…

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;用于实现…

LC719

719. 找出第 K 小的数对距离 719. 找出第 K 小的数对距离 - 力扣&#xff08;LeetCode&#xff09; 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 …

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…

【QT教程】QT6信号与槽 QT信号与槽

QT6信号与槽 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费QT视…

C++-Primer-Plus 习题解答(第十六章-string类和标准模板库)

题目&#xff1a;16.1 回文指的是顺读和逆读都一样的字符串。例如&#xff0c;“tot”和“otto”都 是简短的回文。编写一个程序&#xff0c;让用户输入字符串&#xff0c;并将字符串引用传 递给一个bool函数。如果字符串是回文&#xff0c;该函数将返回true&#xff0c;否则返…

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

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;我们明白…

秒杀系统架构设计-01

前言 在当今互联网技术快速发展的背景下&#xff0c;电商平台的秒杀活动成为了一个热门话题。特别是对于技术人员而言&#xff0c;如何设计一个高效、可靠的秒杀系统架构&#xff0c;已经成为了面试中的常见问题。这篇博文将围绕秒杀系统架构设计的大纲和授课思路&#xff0c;…

【TypeScript高级类型简介以及使用方法】

TypeScript 的高级类型提供了更复杂的类型系统&#xff0c;允许开发者更精确地描述和约束代码中的数据类型。以下是几种常用的 TypeScript 高级类型及其简介和使用方法&#xff1a; 交叉类型&#xff08;Intersection Types&#xff09; 交叉类型是将多个类型合并为一个类型&…