QT day5 作业

服务器头文件

#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_start_clicked();void newConnect_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_start_clicked()
{if(ui->start->text() == "启动"){//获取ui界面上的端口号quint16 port = ui->port->text().toUInt();//启动服务器//将服务器设置为被动监听状态if(ser->listen(QHostAddress::Any,port) == true){QMessageBox::information(this,"成功","服务器启动成功");}else{QMessageBox::information(this,"成功","服务器启动失败");}//当启动服务器后,如果有客户端发来的连接请求,那么服务器就会自动发射一个newConnect信号//我们可以将该信号,连接到对应的槽函数中处理相关逻辑connect(ser,&QTcpServer::newConnection,this,&Widget::newConnect_slot);//将文本内容改成关闭ui->start->setText("关闭");}else{//关闭服务器ser->close();//将文本内容改成启动ui->start->setText("启动");}
}//处理newConnection信号的槽函数实现
void Widget::newConnect_slot()
{qDebug () << "有客户端发来连接请求了,请尽快处理";//获取最新链接的客户端套接字,并将最新连接的套接字地址返回QTcpSocket* socket = ser->nextPendingConnection();//将该客户端套接字放入到客户端容器中cliList.append(socket);//当有客户端向服务器发来数据时,当前这个客户端套接字就会自动发射一个readyRead信号//我们可以将该信号连接到对应的信号处理函数中,处理相关数据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){//功能:判断当前套接字状态//参数:无//返回值:readyRead_slot表示无效的套接字cliList.removeAt(i);    //将下标为i的客户端套接字从容器中移除}}//再将客户端容器遍历一遍,判断哪个客户端中有数据待读for(int i = 0;i<cliList.length();i++){//功能:获取当前套接字中待读取数据的个数//参数:无//返回值:返回套接字中待读取数据的个数,如果为0,表示没有数据可读//如果不等于0,表示有数据可读,可以使用readAll读取数据QByteArray msg = cliList[i]->readAll();//将该信息,展示到ui界面上ui->msg->addItem(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 username;
};
#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);//将客户端的connected信号连接到自定义的槽函数中connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{if(ui->connectBtn->text() == "连接服务器"){//执行连接服务器的工作//获取ui界面上的数据username = ui->userEdit->text();QString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();//向服务器发送连接请求cli->connectToHost(ip,port);//功能:向指定的服务器发送连接请求//参数1:服务器ip地址//参数2:服务器端口号//当成功连接到服务器后,当前客户端会自动发射一个connected信号,我们可以将该信号连接到服务器//由于该操作只需进行一次即可,所以写在构造函数中即可//将按钮内容更改为断开服务器ui->connectBtn->setText("断开服务器");}else{//执行断开服务器工作//将按钮内容更改成连接服务器ui->connectBtn->setText("连接服务器");}
}//自定义处理connected信号的槽函数的实现
void Widget::connected_slot()
{QMessageBox::information(this,"连接","连接服务器成功");
}//信息发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//将ui界面上的文本信息获取下来QString msg = username + ":" + ui->msgEdit->text();//将该消息发送给服务器cli->write(msg.toLocal8Bit());//清空行编辑器中的内容ui->msgEdit->clear();//将消息放入ui界面中QListWidgetItem *item = new QListWidgetItem(msg);item->setTextAlignment(Qt::AlignRight);ui->listWidget->addItem(item);
}//处理readyRead信号对应的槽函数的实现
void Widget::readyRead_slot()
{//将客户端套接字中的消息读取出来QByteArray msg = cli->readAll();//将该消息展示到ui界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}//disconnected信号对应的槽函数
void Widget::disconnectes_slot()
{QMessageBox::information(this,"断开","断开服务器成功");
}

sql头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery>    //数据库查询类
#include <QSqlRecord>   //记录类
#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_addBtn_clicked();void on_searchBtn_clicked();private:Ui::Widget *ui;//实例化一个数据库操作对象QSqlDatabase db;
};
#endif // WIDGET_H

sql源文件

#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");  //表示使用的是sqlite3数据库//给数据库设置名字db.setDatabaseName("mydb.db");}//此时已经创建了该数据库但是还没有打开if(!db.open()){QMessageBox::information(this,"失败","数据库打开失败");return;}//程序执行至此,说明数据库打开成功//准备sql语句QString sql = "create table if not exists Stu(name char,numb int,sex char,score double)";//实例化一个sql语句的执行者QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","创建数据表失败");return;}
}Widget::~Widget()
{delete ui;
}//添加学员信息按钮对应的槽函数
void Widget::on_addBtn_clicked()
{//将ui界面上的相关信息获取下来QString ui_name = ui->nameEdit->text();int ui_number = ui->numberEdit->text().toUInt();QString ui_sex = ui->sexEdit->text();double ui_score = ui->scoreEdit->text().toDouble();//判断是否有空的没有填写的数据if(ui_name == NULL || ui_number == 0 || ui_sex == NULL || ui_score == 0){QMessageBox::information(this,"提示","有内容没有填写");return;}//准备sql语句QString sql = QString("insert into Stu values('%1',%2,'%3',%4)").arg(ui_name).arg(ui_number).arg(ui_sex).arg(ui_score);//实例化一个sql语句的执行者QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","添加数据失败");return;}else{QMessageBox::information(this,"提示","添加数据成功");return;}
}//查找按钮对应的槽函数
void Widget::on_searchBtn_clicked()
{QString sql;//准备sql语句if(ui->nameEdit->text() == NULL){sql = "select * from Stu";}else{sql = QString("select '%1' from Stu").arg(ui->nameEdit->text());}//执行sql语句//实例化一个sql语句的执行者QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","查询数据失败");return;}//将查询结果展示到ui界面上int i = 0;while(query.next()){//这里面是一个任意的查询结果,query对象中保存的是当前的一个记录//可以通过成员函数:QSqlRecord QSqlQuery::record() const//通过QSqlRecord类的成员函数:count,来获取当前记录中的列数//通过调用QSqlRecord类的成员函数:value(i),来获取下标为i列的那一项的数据值for(int j = 0;j < query.record().count();j++){qDebug() << query.record().value(j).toString();//将数据库中的数据,依次存放到ui界面中ui->tableWidget->setItem(i, j, new QTableWidgetItem(query.record().value(j).toString()));}i++;}
}

思维导图

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

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

相关文章

vscode无法连接 , .vscode-server版本问题

vscode无法连接 &#xff0c; .vscode-server版本问题 解决办法 &#xff1a; 查看自己的版本号 2. 两边vscode版本号需要一致 找一台vscode可以远程连接的&#xff0c; 将它的.vscode-server/bin/b06ae3b2d2dbfe28bca3134cc6be65935cdfea6a 传到 远程服务器上 或者 本地的…

VTK 数据类型:vtkUnstructuredGrid

VTK 数据类型&#xff1a;vtkUnstructuredGrid VTK 数据类型&#xff1a;vtkUnstructuredGridVTK 中数据类型的继承关系常用的几何类型实例&#xff1a;vtkHexahedron 和 vtkTetra VTK 数据类型&#xff1a;vtkUnstructuredGrid 非结构化点是在空间中离散随意分布的点&#xf…

【数据可视化01】matplotlib实例介绍2

目录 一、引言二、实例介绍1.箱线图2.热力图3.3D图 一、引言 接着上一文章【数据可视化01】matplotlib实例介绍1继续介绍matplotlib的实例。 二、实例介绍 在matplotlib中&#xff0c;常用的图形类型包括&#xff1a; 箱线图&#xff08;Box plot&#xff09;&#xff1a;用…

算法day05

第一题 1004. 最大连续1的个数 III 题目如下所示&#xff1a; 如上题所示&#xff1a; 题目本意是在一个数组中只有1和0&#xff0c;给定一个k值&#xff0c;将小于k个0翻转成1&#xff0c;然后返回最终得到最长的1的个数&#xff1b; 我们将这到题的意思转化为另外一种意思&…

单元测试之TestNG知识点总结及代码示例

TestNG 是一个测试框架&#xff0c;用于自动化测试 Java 和 Scala 应用程序&#xff0c;它是 JUnit 和 NUnit 的一个强大替代品。TestNG 支持数据驱动测试、参数化测试、测试套件、依赖管理、多线程测试等特性。TestNG官网&#xff1a;TestNG Documentation 目录 1.TestNG 基…

PCB笔记(二十六):PCB检查

前言 首先检查元器件是否100&#xff05; 放置 文章目录 1、打开DRC2、database check3、检查DRC4、检查多余的线5、其他需要注意的点a.检查差分线、等长线是否已调好b.注意检查晶振、电感等元件上/下方是否其他线经过&#xff08;一般不允许线经过&#xff09;c.打开place_bo…

【管理咨询宝藏101】普华永道并购尽调内部培训

【管理咨询宝藏101】普华永道并购尽调内部培训 【格式】PDF版本 【关键词】普华永道、兼并收购、尽职调查 【核心观点】 - 尽职调查的目的&#xff0c;发现潜在的致命缺陷&#xff0c;判断是否继续交易进程&#xff1b;发现潜在的问题&#xff0c;制定交易前后相应的应对措施。…

C语言 | Leetcode C语言题解之第88题合并两个有序数组

题目&#xff1a; 题解&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2--];} else if (p2 -1) {cur nu…

Kali Linux菜单中各工具功能大全

网络安全学习路线 &#xff08;2024最新整理&#xff09; 如图片过大被平台压缩导致看不清的话&#xff0c;评论区点赞和评论区留言扣1或者关注我我后台会主动发给你&#xff01; 第一阶段&#xff1a;安全基础 网络安全行业与法规 Linux操作系统 计算机网络 HTML PHP Mysql P…

【董晓算法】竞赛常用知识之字符串2

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列&#xff08;还没学完&#xff09; 【董晓算法】动态规划之线性DP问题-CSDN博客 【董晓算法】动态规划之背包DP问题&#xff…

用Rust打印杨辉三角

一、杨辉三角是什么&#xff1f; 杨辉三角是一个著名的数学图形&#xff0c;它展示了二项式系数的排列方式。 杨辉三角是一种将二项式系数以三角形阵列排列的数学图形&#xff0c;具有丰富的历史和数学意义。 杨辉三角的历史起源可以追溯到中国南宋时期&#xff0c;由数学家杨辉…

极端天气对气膜建筑有什么影响吗—轻空间

气膜建筑在近年来的发展迅速&#xff0c;逐渐替代了一部分传统建筑&#xff0c;展现了良好的市场前景。然而&#xff0c;面对自然环境中的极端天气&#xff0c;如暴风、暴雨和暴雪&#xff0c;气膜建筑是否能够经受住考验是大家关注的焦点。轻空间带您探讨一下这些极端天气对气…

探究NVMe SSD HMB应用场景与影响-<续>

如果需要采用HMB功能&#xff0c;需要SSD支持NVME协议且NVMe 1.2及以上版本。NVME协议中对HMB对应有2个关键参数&#xff1a; HMB建议值&#xff08;HMPRE&#xff09;&#xff1a;设定实际分配给HMB使用的主机内存容量&#xff0c;为设备提供最优性能的内存分配量。 HMB最小值…

双星号(**)和单星号(*)在Python参数传递中的妙用

在Python中&#xff0c;参数传递是一个非常重要的概念&#xff0c;它允许函数接收任意数量的参数。而双星号(**)和单星号(*)在参数传递中扮演着关键角色。本文将详细讲解这两个符号的用法&#xff0c;并通过示例代码帮助初学者理解它们的工作原理。 单星号(*) 单星号(*)用于函…

EPS软件标注点坐标值

1、如下&#xff0c;点击右侧&#xff08;尺寸标注&#xff09;按钮&#xff1a; 2、弹出一个对话框&#xff0c;如下&#xff1a; 3、在上图对话框中设置好箭头样式和小数位数&#xff0c;然后点击图上一点&#xff0c;右击结束再鼠标指定位置&#xff0c;如下&#xff1a; 如…

CV每日论文--2024.5.10

1、Attention-Driven Training-Free Efficiency Enhancement of Diffusion Models 中文标题&#xff1a;扩散模型的注意力驱动的训练免费效率增强 简介&#xff1a;扩散模型在生成高质量和多样化图像方面取得了出色的表现,但其卓越性能是以昂贵的架构设计为代价的,特别是广泛使…

数据库——SQL SERVER(先学删库跑路)

目录 一&#xff1a;什么是数据库 二&#xff1a;为什么需要数据库 三&#xff1a;数据库的安装 四&#xff1a;学前必备知识 1. 数据库原理 2. 数据库与编程语言 3. 数据库与数据结构的区别 4. 连接 5. 有了编程语言为啥还要数据库 6. 初学者学习数据库的三个方面 …

高校推免报名|基于SSM+vue的高校推免报名系统的设计与实现(源码+数据库+文档)

高校推免报名 目录 基于SSM&#xff0b;vue的高校推免报名的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台登录模块 5.2.1管理员功能模块 5.2.2考生功能模版 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章&#xff0c;这两篇文章套路是一样的&#xff0c;只是在不同国家进行。 在计算combined PAF或者说weighted PAF的时候&#xff0c;先建立了相关矩阵&#xff0c;再做主成分分析&#xff0c;得到communality。详细信息大家可翻阅…

el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联

Vue实现 el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联 效果展示 首先el-calendar需要自定义日程内容的话,其格式一般必须满足如下结构 dataList = [{date: 2024-05-08, content: "数学模拟试卷(3)"},{date: 2024-05-08, content: …