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.rhkb.cn/news/323989.html

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

相关文章

MySQL——变量的浮点数问题处理

新建链接&#xff0c;自带world数据库&#xff0c;里面自带city表格。 DQL #MySQL变量的浮点数问题处理 set dx3.14,dy3.25; select dxdy;#计算显示异常&#xff0c;会有很多00000的提示set resultdxdy; select result; 查询结果

Kafka分级存储概念(一)

Kafka分级存储及实现原理 概述 Kafka社区在3.6版本引入了一个十分重要的特性: 分级存储,本系列文章主要旨在介绍Kafka分级存储的设计理念、设计细节以及具体的代码实现 背景:为什么要有分级存储? 场景 作为一款具有高吞吐及高性能的消息中间件,Kafka被广泛应用在大数据、…

如何使用jmeter进行接口测试?jmeter接口测试流程是怎样的

前言 我们学习自动化测试都会用到不同的工具&#xff0c;那么今天笔者呢&#xff0c;想给大家聊聊Jmeter接口测试流程详解&#xff0c;废话不多说直接进入正题。 一、jmeter简介 Jmeter是由Apache公司开发的java开源项目&#xff0c;所以想要使用它必须基于java环境才可以&am…

让GPT们成为我们的小助手:使用ChatGPT来生成测试用数据

让GPT们成为我们的小助手 任务&#xff1a;帮忙生成测试数据 今天本来想做一个测试&#xff0c;所以需要一些测试数据。为了让测试显得更真实&#xff0c;所以希望测试数据看上去就是一份真实的数据&#xff0c;所以我就希望ChatGPT&#xff08;这里是代指&#xff0c;我有使…

太阳能无人机的多元化应用

随着新能源技术的不断发展和成熟&#xff0c;太阳能在无人机的应用技术已经成熟。太阳能无人机得到了量产和广泛的应用。传统无人机相比&#xff0c;太阳能无人机无需燃油&#xff0c;运行费用低廉&#xff0c;搭载多种高科技设备&#xff0c;能够高效、多元化地采集和分析各类…

UG NX二次开发(C#)-获取Part中对象创建时的序号(*)

文章目录 1、前言2、UG NX的对象序号讲解3、采用UG NX二次开发或者建模序号4、注意事项1、前言 在UG NX中,我们创建任意一个对象,都会在模型历史中添加一个创建对象的编号,即是对象序号,这个是递增的,当删除中间产生的对象时,其序号会重新按照建模顺序重新排布。今天一个…

宝塔面板如何删除一个站点

我们一般的网站都是PHPMySQL开发的&#xff0c;所以删除站点&#xff0c;就要先删数据库&#xff0c;再删网站目录 注意&#xff1a;一点要确保无用的再删 删除站点目录

布局全球内容生态,酷开科技Coolita AIOS以硬核品质亮相

当前&#xff0c;全球产业链供应链格局持续重构&#xff0c;成为影响中国对外经济发展的重要因素。2024年4月15至5月5日&#xff0c;历史久、规模大、层次高&#xff0c;作为中国外贸风向标的第135届中国进出口商品交易会&#xff08;即广交会&#xff09;在美丽的广州隆重举行…

CTFHUB-技能树-Web题-RCE(远程代码执行)-文件包含

CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09; 文件包含 文章目录 CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09;文件包含解题方法1:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/71f7355b3c124dfe8cdf1c95e6991553.png#pic_ce…

Linux 麒麟系统安装

国产麒麟系统官网地址&#xff1a; https://www.openkylin.top/downloads/ 下载该镜像后&#xff0c;使用VMware部署一个虚拟机&#xff1a; 完成虚拟机创建。点击&#xff1a;“开启此虚拟机” 选择“试用试用开放麒麟而不安装&#xff08;T&#xff09;”&#xff0c;进入op…

uniapp生成二维码(uQRCode)与自定义绘制样式与内容

二维码生成使用了一款基于Javascript环境开发的插件 uQRCode &#xff0c;它不仅适用于uniapp&#xff0c;也适用于所有Javascript运行环境的前端应用和Node.js。 uQRCode 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287 目录 1、npm安装 2、通过import引…

从零开始的软件测试学习之旅(六)测试网络基础知识

测试网络基础知识 HTTP和HTMLURLDNS客户端和服务器请求方法和状态码面试高频Fiddler抓包工具教学弱网 HTTP和HTML 概念 html: HyperText Markup Language 超文本标记语言 http: HyperText Transfer Protocol 超文本传输协议 超文本: 图片, 音频, 视频 关系:http 可以对 html 的…

C++对象的拷贝构造函数

如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。 拷贝(复制)构造函数:利用同类对象构造一个新的对象 ●1.函数名和类同名 (构造函数) ●2.没有返回值 (构造函数) ●3.第一个参数必…

Linux基础之git与调试工具gdb

目录 一、git的简单介绍和使用方法 1.1 git的介绍 1.2 git的使用方法 1.2.1 三板斧之git add 1.2.2 三板斧之git commit 1.2.3 三板斧之git push 二、gdb的介绍和一些基本使用方法 2.1 背景介绍 2.2 基本的使用方法 一、git的简单介绍和使用方法 1.1 git的介绍 Git是一…

Kubernetes——基础认识

一、简介 1.Kubernetes是什么 Kubernetes 是一个全新的基于容器技术的分布式架构解决方案&#xff0c;是 Google 开源的一个容器集群管理系统&#xff0c;Kubernetes 简称 K8S。 Kubernetes 是一个一站式的完备的分布式系统开发和支撑平台&#xff0c;更是一个开放平台&#x…

249 基于matlab的MED、OMEDA、MOMEDA、MCKD信号处理方法

基于matlab的MED、OMEDA、MOMEDA、MCKD信号处理方法。最小熵反褶积(MED)&#xff0c;最优最小熵反卷积调整卷积 (OMEDA),多点最优最小熵解卷积调整&#xff08;Multipoint Optimal Minimum Entropy Deconvolution Adjusted&#xff0c;MOMEDA&#xff09;&#xff0c;最大相关峭…

el-select选项框内容过长

利用popper-class实现选项框内容过长&#xff0c;截取显示功能&#xff1a; <el-select popper-class"popper-class" :popper-append-to-body"false" v-model"value" placeholder"请选择"><el-optionv-for"item in opt…

Cocos creator实现《战机长空》关卡本地存储功能

Cocos creator实现《战机长空》关卡本地存储功能 Cocos creator在开放小游戏过程中&#xff0c;经常会出现设置关卡&#xff0c;这里记录一下关卡数据本地存储功能。 一、关卡设置数据 假如我们有关卡数据如下&#xff0c; let settings [ { level: 1, // 第1关 score: 0,…

14_Scala面向对象编程_属性

文章目录 属性1.类中属性声明2.系统默认赋值3.BeanProperty4.整体代码如下 属性 1.类中属性声明 // 1.给Scala声明属性&#xff1b;var name :String "zhangsan"val age :Int 302.系统默认赋值 scala由于初始化变量必须赋值&#xff0c;为了解决此问题可以采…

Docker部署nginx并启用https加密连接

前言 在当今互联网时代&#xff0c;安全性成为越来越重要的议题。随着网络攻击日益猖獗&#xff0c;保护数据和通信的安全性变得至关重要。在这种背景下&#xff0c;对于在 Docker 中运行 Nginx 是否需要使用 HTTPS 这一问题&#xff0c;我们需要考虑到网络安全的重要性以及 H…