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://xiahunao.cn/news/3030318.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

求阶乘n!末尾0的个数溢出了怎么办

小林最近遇到一个问题&#xff1a;“对于任意给定的一个正整数n&#xff0c;统计其阶乘n&#xff01;的末尾中0的个数”&#xff0c;这个问题究竟该如何解决&#xff1f; 先用n5来解决这个问题。n的阶乘即n!5!5*4*3*2*1120&#xff0c;显然应该为2个数相乘等于10才能得到一个结…

笔记本电脑怎么查看硬盘型号?无需额外软件,五招让你轻松掌握

随着科技的进步&#xff0c;笔记本电脑已经成为我们日常生活和工作中不可或缺的工具。而在选购或维护笔记本电脑时&#xff0c;了解硬盘的型号和性能是至关重要的。本文以windows10系统为例&#xff0c;将向您介绍几招&#xff0c;帮助您轻松掌握查看笔记本电脑硬盘型号的方法。…

福昕PDF阅读器取消手型工具鼠标点击翻页

前言&#xff1a; 本文介绍如何关闭福昕PDF阅读器取消手型工具鼠标点击翻页&#xff0c;因为这样真的很容易误触发PDF翻页&#xff0c;使用起来让人窝火。 引用&#xff1a; NA 正文&#xff1a; 新版的福昕PDF阅读器默认打开了“使用手型工具阅读文章”这个勾选项&#x…

【文化课学习笔记】【物理】功与能

【物理】功与能 功 基础概念 定义 一个物体在力的作用下&#xff0c;沿力的方向&#xff0c;通过一段距离(位移)&#xff0c;则称这个力做了功。 公式 功的定义式&#xff1a; \[W Fx \] 这里的 \(x\) 指的是物体沿力的方向上发生的位移。由于力 \(F\) 和位移 \(x\) 都是矢量&…

BLIP和BLIP2 论文讲解

文章目录 BLIPIntroductionMethod模型架构预训练目标字幕和过滤&#xff08;Capfilt&#xff09; BLIP2IntroductionMethod模型结构Q-Former预训练第一阶段Q-Former预训练第二阶段 BLIP 论文&#xff1a; 《BLIP: Bootstrapping Language-Image Pre-training for Unified Visio…

DiskCatalogMaker for Mac:高效管理磁盘文件助手

DiskCatalogMaker for Mac&#xff0c;助您高效管理磁盘文件&#xff0c;让文件整理变得轻而易举&#xff01;这款软件以其出色的性能和人性化的设计&#xff0c;赢得了广大Mac用户的喜爱。 DiskCatalogMaker支持多种磁盘格式&#xff0c;让您轻松管理硬盘、U盘、光盘等存储设备…

景源畅信电商:抖音小店开店的步骤有哪些?

在移动互联网高速发展的今天&#xff0c;利用短视频平台进行商品营销已成为一种潮流。抖音作为其中的佼佼者&#xff0c;吸引了无数商家纷纷入驻&#xff0c;希望通过这个巨大的流量池实现产品推广和销售。然而&#xff0c;想要在抖音上开设一家小店并非想象中那么简单&#xf…

一文带你了解军用电源绝缘性能测试规范和标准

军用电源是指主要用于军事、航空航天等领域的电源模块&#xff0c;因其良好的稳定性和可靠性也在通信、交通、航空航海、加工工业等领域广泛应用。因此&#xff0c;对于军用电源的性能要求比较严格&#xff0c;性能测试是确保电源质量的关键环节。 那么&#xff0c;在测试军品电…

【前端基础】CSS样式+Vue中绘制时间轴

深度选择器 在 Vue.js 中&#xff0c;/deep/、>>>、:deep 和 ::v-deep 这些都是深度选择器&#xff0c;用于修改子组件的样式。它们主要用于解决作用域样式和组件样式之间的冲突问题。 1. /deep/ 或 >>> /deep/ 和 >>> 是相同的选择器&#xff0c;…

谈基于ATTCK框架的攻击链溯源

引言 网络安全在当今数字化时代变得尤为关键&#xff0c;而MITRE公司开发的ATT&CK框架则成为了安全专业人员的重要工具。ATT&CK是一种广泛使用的攻击行为分类和描述框架。其目的在于提供一个共同的语言&#xff0c;使安全专业人员能够更好地理解攻击者的行为和目标&…

并发问题系统学习(更新中)

进程、线程 进程&#xff1a;进程是代码在数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位。可以理解为一个java应用。 线程&#xff1a;线程是进程的一个执行路径&#xff0c;一个进程中至少有一个线程&#xff0c;进程中的多个线程共享进程的资源。…

Qt三方库:QuaZIP介绍、编译和使用

前言 Qt使用一些压缩解压功能&#xff0c;探讨过libzip库&#xff0c;zlib库&#xff0c;libzip库比较原始&#xff0c;还有其他库&#xff0c;都比较基础&#xff0c;而在基础库之上&#xff0c;又有高级封装库&#xff0c;Qt中的QuaZIP是一个很好的选择。Quazip是一个用于压缩…

169.招式拆解 II(unordered_map)

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

使用FFmpeg处理RTSP视频流并搭建RTMP服务器实现图片转直播全流程

目录 一、FFmpeg安装与配置教程二、搭建并配置Nginx RTMP服务器三、从RTSP视频流提取帧并保存为图片四、将图片序列转换为视频五、将视频推送为直播流六、将图片序列推送为直播流 在实时音视频领域&#xff0c;我们经常需要处理从各种源&#xff08;如摄像头&#xff09;获取的…

centos7.8 迁移为 TencentOS Server 2.4(TK4) 报错解决

文章目录 一 问题二 解决三 注意 一 问题 CentOS 官方计划停止维护 CentOS Linux 项目&#xff0c;公司某台腾讯云的centos7.8服务器计划迁移为 TencentOS Server 2.4(TK4) 。在下载rpm包执行迁移命令后报错&#xff0c;场景还原如下。 首先 安装 Python 3 yum install -y p…

【智能优化算法】白鲨智能优化算法(White Shark Optimizer,WSO)

白鲨智能优化算法(White Shark Optimizer,WSO)是期刊“KNOWLEDGE-BASED SYSTEMS”&#xff08;中科院一区期刊 IF8.6&#xff09;的2022年智能优化算法 01.引言 白鲨智能优化算法(White Shark Optimizer,WSO)的核心理念和基础灵感来自大白鲨的行为&#xff0c;包括它们在导航和…

react18【实战】tab切换,纯前端列表排序(含 lodash 和 classnames 的安装和使用)

技术要点 动态样式 className{tabItem ${currentType item.value && "active"}}安装 lodash npm i --save lodash使用 lodash 对对象数组排序&#xff08;不会改变源数组&#xff09; _.orderBy(dataList, "readNum", "desc")src\De…

自然资源-地质勘查工作的流程梳理

自然资源-地质勘查工作的流程梳理 地质勘查从广义上可理解为地质工作&#xff0c;地质队员就好像是国家宝藏的“寻宝人”&#xff0c;通过地质勘查&#xff0c;为国家找矿&#xff0c;以保障国家能源资源安全和服务国计民生&#xff0c;发挥着地质工作在国民经济建设中的基础性…

AI PC后时代:重新理解大模型的最佳载体

如果站在人机交互变革的角度来畅想&#xff0c;AI PC所带来的变革可以说是人机交互史上的又一次“颠覆”。元宇宙时代下&#xff0c;是苹果让AI装进了Vision Pro里&#xff1b;那么在如今的AI时代&#xff0c;又将会是谁将AI PC彻底照进现实&#xff1f;谁才是最终赢家&#xf…

代码随想录算法训练营第六十三天|84.柱状图中最大的矩形

代码随想录算法训练营第六十三天|84.柱状图中最大的矩形 84.柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&…