2024.05.10作业

TCP服务器

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QMessageBox>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_staetbtn_clicked();void newConnection_slot();void readyRead_slot();private:Ui::Widget *ui;QTcpServer *ser;QList<QTcpSocket *> cliList;
};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ser=new QTcpServer(this);
}Widget::~Widget()
{delete ui;
}
//启动按钮的槽函数
void Widget::on_staetbtn_clicked()
{if(ui->staetbtn->text()=="启动"){//获取ui界面上的端口号quint16 port=ui->portedit->text().toInt();//启动服务器if(ser->listen(QHostAddress::Any,port)==true){QMessageBox::information(this,"成功","服务器启动成功");}else{QMessageBox::information(this,"失败","服务器启动失败");}connect(ser,&QTcpServer::newConnection,this,&Widget::newConnection_slot);//按钮文本更改ui->staetbtn->setText("关闭");}else{//关闭服务器ser->close();//更改按钮文本内容ui->staetbtn->setText("启动");}
}
//处理newConnection信号的槽函数
void Widget::newConnection_slot()
{//获取最新连接的客户端套接字,并将QTcpSocket* socket=ser->nextPendingConnection();cliList.append(socket);connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
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界面ui->msgwidget->addItem(QString::fromLocal8Bit(msg));//将该消息转发给所有客户端for(int j=0;j<cliList.length();j++){if(i!=j)    //不转发自己{cliList[j]->write(msg);}}}}
}

客户端

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectbtn_clicked();void connected_slot();void on_sendbtn_clicked();void readyRead_slot();void disconnectes_slot();private:Ui::Widget *ui;QTcpSocket *cli;QString user;};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);cli=new QTcpSocket(this);//将客户端的connect信号连接到自定义的槽函数connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);//客户端收到服务器消息时会自动发射一个readyRead信号connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//断开信号连接对应的槽函数connect(cli,&QTcpSocket::disconnected,this,&Widget::disconnectes_slot);
}
Widget::~Widget()
{delete ui;
}
//连接服务器按钮对应得到槽函数
void Widget::on_connectbtn_clicked()
{if(ui->connectbtn->text()=="连接服务器"){user=ui->userEdit->text();QString ip=ui->IPEdit->text();quint16 port=ui->portEdit->text().toUInt();cli->connectToHost(ip,port);ui->connectbtn->setText("断开服务器");}else{QString msg=user+"已下线";cli->write(msg.toLocal8Bit());cli->disconnectFromHost();ui->connectbtn->setText("连接服务器");}
}
//connected信号的槽函数的实现
void Widget::connected_slot()
{QMessageBox::information(this,"连接","连接成功");
}
//信息发送按钮对应的槽函数
void Widget::on_sendbtn_clicked()
{//将ui界面上的文本信息获取下来QString msg=user+":"+ ui->lineEdit->text();//将消息发送给服务器cli->write(msg.toLocal8Bit());//清空6行编辑器的内容ui->lineEdit->clear();//将消息放入ui界面中QListWidgetItem *item=new QListWidgetItem(msg);item->setTextAlignment(Qt::AlignRight);ui->msgwidget->addItem(item);
}
//处理readyRead信号对应的槽函数
void Widget::readyRead_slot()
{//将客户端套接字中的消息读取出来QByteArray msg=cli->readAll();//将消息展示到ui界面ui->msgwidget->addItem(QString::fromLocal8Bit(msg));
}
//disconnected信号对应的槽函数
void Widget::disconnectes_slot()
{QMessageBox::information(this,"断开","断开连接");
}

数据库

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QMessageBox>
#include <QSqlQuery>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_addbtn_clicked();void on_searchbtn_clicked();void on_deletebtn_clicked();void on_updataButton_clicked();private:Ui::Widget *ui;QSqlDatabase db;
};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);if(!db.contains("mydb.db")){db=QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("mydb.db");}if(!db.open()){QMessageBox::information(this,"失败","打开失败");return;}QString sql="create table if not exists Stu(numb int,name char,sex char,score double);";QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","创建失败");return;}
}Widget::~Widget()
{delete ui;
}
//添加槽函数
void Widget::on_addbtn_clicked()
{int ui_numb=ui->numEdit->text().toUInt();QString ui_name=ui->nameedit->text();QString ui_sex=ui->sexEdit->text();double ui_score=ui->scoreedit->text().toUInt();if(ui_sex==NULL||ui_numb==0||ui_name==NULL||ui_score==0){QMessageBox::information(this,"提示","请将信息填写完整");return;}QString sql=QString("insert into Stu values(%1,'%2','%3',%4)").arg(ui_numb).arg(ui_name).arg(ui_sex).arg(ui_score);QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","添加失败");return;}else{QMessageBox::information(this,"提示","添加成功");//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();return;}}//查找槽函数
void Widget::on_searchbtn_clicked()
{ui->tableWidget->clearContents();QString sql;if(ui->nameedit->text()==NULL){sql="select *from Stu";}else{sql=QString("select * from Stu where name='%1'").arg(ui->nameedit->text());}QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","查找失败");return;}//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();int i=0;while(query.next()){for(int j=0;j<query.record().count();j++){QTableWidgetItem *item=new QTableWidgetItem(query.record().value(j).toString());item->setTextAlignment(Qt::AlignCenter);ui->tableWidget->setItem(i,j,item);}i++;}
}
//删除槽函数
void Widget::on_deletebtn_clicked()
{QString sql;if(ui->nameedit->text()==NULL){sql="delete from Stu";}else{sql=QString("delete from Stu where name='%1'").arg(ui->nameedit->text());}QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","删除失败");return;}else{QMessageBox::information(this,"提示","删除成功");//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();}
}
//修改槽函数
void Widget::on_updataButton_clicked()
{QString sql;sql=QString("update Stu set score=%1 where name='%2'").arg(ui->scoreedit->text()).arg(ui->nameedit->text());QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","修改失败");return;}else{QMessageBox::information(this,"提示","修改成功");//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();}
}

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

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

相关文章

【神器来袭】快速解放双手,朋友圈自动转发工具,告别繁琐操作!

朋友圈作为一个重要的营销推广渠道&#xff0c;如果能实现自动转发&#xff0c;那对于很多企业或个人来说&#xff0c;是极好的。下面&#xff0c;就给大家分享一个实用且便捷的朋友圈运营工具——个微管理系统&#xff0c;让大家都能快速推广。 1、多账号登录&#xff0c;定时…

适用于 macOS 的最佳独立 HBO Max 客户端

适用于 macOS 的最佳独立 HBO Max 应用程序。不再在浏览器选项卡之间切换。只需直接从 Dock 启动 Clicker for HBO Max 即可开始狂欢。 HBO Max 客户端 Clicker for HBO Max 下载 Clicker for HBO Max mac版安装教程 软件下载完成后&#xff0c;双击pkg根据提示进行安装 Clic…

ssh远程免密登录

ssh远程连接分为五个阶段 版本号协商阶段密钥和算法协商阶段认证阶段会话请求阶段交互会话阶段 而上图的SessionKey即是在阶段2&#xff1a;密钥和算法协商阶段&#xff0c;服务器端和客户端利用DH交换&#xff08;Diffie-Hellman Exchange&#xff09;算法、主机密钥对等参数…

编译适配纯鸿蒙系统的ijkplayer中的ffmpeg库

目前bilibili官方的ijkplayer播放器&#xff0c;是只适配Android和IOS系统的。而华为接下来即将发布纯harmony系统&#xff0c;是否有基于harmony系统的ijkplayer可以使用呢&#xff1f; 鸿蒙版ijkplayer播放器是哪个&#xff0c;如何使用&#xff0c;这个问题&#xff0c;大家…

暴力法解决最近对问题和凸包问题-实现可视化

目录 最近对问题 凸包问题 最近对问题 顾名思义就是采用蛮力法求出所有点之间的距离&#xff0c;然后进行比较找出第一个最近对&#xff0c;一个一个进行比较。 大概思路就是如图&#xff08;每个圈代表一个数对&#xff09; 第一个和其他四个比较 第二个和其他三个比较 …

新版文件同步工具(Python编写,其中同时加入了多进程计算MD5、多线程复制大文件、多协程复制小文件、彩色输出消息、日志功能)

两个月前&#xff0c;接到一个粉丝的要求&#xff0c;说希望在我之前编写的一个python编写的文件同步脚本(Python编写的简易文件同步工具(已解决大文件同步时内存溢出问题)https://blog.csdn.net/donglxd/article/details/131225175)上加入多线程复制文件的功能&#xff0c;前段…

英语学习笔记8——What‘s your job?

What’s your job? 你是做什么工作的&#xff1f; 词汇 Vocabulary policeman 男警察 policewoman 女警察 police n. 警力 集合名词&#xff0c;永表复数 西方国家警察管的事很多。交警&#xff0c;刑警&#xff0c;武警一般不分开。 taxi driver 出租车司机 taxi / cab n.…

空间复杂度

前言 通过上一节的学习&#xff0c;我们知道了衡量一个算法是否高效的标准就是复杂度&#xff0c;我们已经学习了时间复杂度&#xff0c;那么本节我们就了解一下空间复杂度的相关知识&#xff0c;那么我们废话不多说&#xff0c;正式进入今天的学习 空间复杂度 空间复杂度也是…

python爬虫(三)之虎嗅网汽车文章爬虫

python爬虫&#xff08;三&#xff09;之虎嗅网汽车文章爬虫 闲来没事&#xff0c;闲鱼上有个好兄弟要我从虎嗅网上抓一些汽车文章的爬虫&#xff0c;于是大力出奇迹&#xff0c;我写了一个python程序&#xff0c;将这个网站上所有的汽车文章全部抓取下来了&#xff0c;存储到…

若依生成代码的步骤

1.创建表&#xff0c;要有注释 2.导入表 3.创建主菜单 4.修改表 5.生成代码 6.把代码复制到自己的程序中&#xff1a;复制表、后端、前端 7.重启后端&#xff0c;如果有问题则clean 8.回到浏览器可以看到正常显示了生成的页面

JAVA获取application.yml配置文件的属性值

application.yml配置参数 方式一&#xff1a;使用Value方式(常用) 语法 Value("${配置文件中的key:默认值}") Value("${配置文件中的key}")方法1&#xff1a;使用的类文件中定义变量&#xff0c;直接使用变量 import org.springframework.beans.factory.an…

【2024】Gradle安装配置以及基于Kotlin 进行详细使用

目录&#x1f4bb; 一、介绍二、安装Gradle1、下载安装2、配置环境变量2.1、mac2.2、windows 3、配置国内国内镜像源4、初始化Gradle项目4.1、项目结构4.2、Gradle常用命令 三、项目配置1、配置文件介绍1.1、设置文件settings.gradle1.1.1、单体项目1.1.2、父子项目 1.2、构建文…

5.2 Java全栈开发前端+后端(全栈工程师进阶之路)-服务端框架-Spring框架-相信我看这一篇足够

1.Spring框架 1.1.Spring框架简介 Spring是一个基于java的轻量级的、一站式框架。 虽然Spring是一个轻量级框架&#xff0c;但并不表示它的功能少。实际上&#xff0c;spring是一个庞然大物&#xff0c;包罗万象。 时至今日&#xff0c;Spring已经成为java世界中事实上的标准…

常用控件(一)

常用控件 一 按钮类控件QPushButtonQRadioButtonQCheckBox 按钮类控件 QPushButton 使用QPushButton表示一个按钮&#xff0c;这是我们当前最熟悉的一个控件了; QPushButton继承自QAbstractButton&#xff0c;这个类是个抽象类&#xff0c;是其他按钮类的父类; QAbstractButt…

Java毕业设计 基于SpringBoot vue新能源充电系统

Java毕业设计 基于SpringBoot vue新能源充电系统 SpringBoot 新能源充电系统 功能介绍 首页 图片轮播 充电桩 充电桩类型 充电桩详情 充电桩预约 新能源公告 公告详情 登录注册 个人中心 余额充值 修改密码 充电桩报修 充电桩预约订单 客服 后台管理 登录 个人中心 修改密码…

网工交换基础——VLAN Maping

一、定义 VLAN Maping通过修改报文携带的VLAN Tag来实现不同VLAN的相互映射。 二、应用场景 1、场景一&#xff1a;两个VLAN相同的二层用户网络通过骨干网络互联&#xff0c;为了实现用户之间的二层互通&#xff0c;以及二层协议&#xff08;例如MSTP等&#xff09;的统一部署…

layui select 绑定onchange事件失效

layui select 绑定onchange事件失效 问题背景解决方案 问题背景 在日常工作中&#xff0c;可能会用到页面 freemaker 以及 layui 前端框架&#xff0c;这个时候直接在 select 上面绑定 onchange 事件往往是不生效的&#xff0c;错误的方式 这种方式给 select 绑定的 onchange…

智慧景区新篇章:山海鲸可视化管理解析

随着旅游业的蓬勃发展&#xff0c;景区管理面临着越来越多的挑战。如何提升游客体验、优化资源配置、确保游客安全&#xff0c;成为景区管理者亟需解决的问题。山海鲸智慧景区管理可视化系统&#xff0c;以其先进的技术和创新的理念&#xff0c;为景区管理带来了全新的解决方案…

图像ISP——AGC参数解析

前言 AWB和AGC是两种常见的自动调整功能。AWB用于自动调整图像的白平衡&#xff0c;以确保颜色在不同光照条件下仍然看起来自然。而AGC则用于自动调整图像的增益&#xff0c;以在不同的亮度条件下保持适当的曝光。 代码例程 static AWB_AGC_TABLE_S g_stAwbAgcTable {/* bvali…

厉害了,OPCUA协议助力航天工业探索苍穹!

今年以来&#xff0c;航天科技真是捷报频频&#xff0c;神州十八号载人飞船和嫦娥六号均发射成功&#xff01;还让宇航员成功地进入了天宫空间站&#xff0c;可喜可贺。说到航天过程&#xff0c;其中有一个环节尤为重要&#xff0c;就是布置众多望远镜。有人可能会问&#xff0…