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

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

相关文章

【C语言】精品练习题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…

大文件传输的好帮手Libarchive:功能强大的开源归档文件处理库

在数字化时代&#xff0c;文件的存储和传输对于企业的日常运作至关重要。但是&#xff0c;服务器中的压缩文件往往无法直接查看或预览&#xff0c;这给用户带来了不便。为了解决这一问题&#xff0c;在线解压功能的开发变得尤为重要。接下来&#xff0c;小编将介绍一个能够实现…

RabbitMQ(安装配置以及与SpringBoot整合)

文章目录 1.基本介绍2.Linux下安装配置RabbitMQ1.安装erlang环境1.将文件上传到/opt目录下2.进入/opt目录下&#xff0c;然后安装 2.安装RabbitMQ1.进入/opt目录&#xff0c;安装所需依赖2.安装MQ 3.基本配置1.启动MQ2.查看MQ状态3.安装web管理插件4.安装web管理插件超时的解决…

使用xtuner微调InternLM-Chat-7B

1. 安装xtuner #激活环境 source activate test_llm # 安装xtuner pip install xtuner#还有一些依赖项需要安装 future>0.6.0 cython lxml>3.1.0 cssselect mmengine 2. 创建一个ft-oasst1 数据集的工作路径&#xff0c;进入 mkdir ft-oasst1 cd ft-oasst1 3.XTune…

MySQL系列之索引

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

【Linux】环境变量是什么?如何配置?详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

C++11:并发新纪元 —— 深入理解异步编程的力量(1)

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《C11&#xff1a;并发新纪元 —— 深入理解异步编程的力量》&#xff0c;在这篇文章中&#xff0c;你将会学习到C新特性以及异步编程的好处&#xff0c;以及其如何带来的高性能的魅力&…

【算法】动态规划之背包DP问题(2024.5.11)

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列 【算法】动态规划之线性DP问题-CSDN博客 01背包 步骤&#xff1a; 分析容量j与w[i]的关系&#xff0c;然后分析是否要放…

OGG几何内核开发-BRepAlgoAPI_Fuse与BRep_Builder.MakeCompound比较

最近在与同事讨论BRepAlgoAPI_Fuse与BRep_Builder.MakeCompound有什么区别。 一、从直觉上来说&#xff0c;BRepAlgoAPI_Fuse会对两个实体相交处理&#xff0c;相交的部分会重新的生成相关的曲面。而BRep_Builder.MakeCompound仅仅是把两个实体组合成一个新的实体&#xff0c;…

JUC下的BlockingQueue详解

BlockingQueue是Java并发包(java.util.concurrent)中提供的一个接口&#xff0c;它扩展了Queue接口&#xff0c;增加了阻塞功能。这意味着当队列满时尝试入队操作&#xff0c;或者队列空时尝试出队操作&#xff0c;线程会进入等待状态&#xff0c;直到队列状态允许操作继续。这…

https://是怎么实现的?

默认的网站建设好后都是http访问模式&#xff0c;这种模式对于纯内容类型的网站来说&#xff0c;没有什么问题&#xff0c;但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站&#xff0c;为避免这种情况下发生&#xff0c;所以传统的网站改为https协议&#xff0c;这种协议自己…

信息检索(35):LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL

LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL 标题摘要1 引言2 相关工作3 LEXMAE&#xff1a;词典瓶颈屏蔽自动编码器3.1 语言建模编码器3.2 词典瓶颈模块3.3 弱化掩蔽式解码器3.4 词汇加权检索器的预训练目标和微调 4 实验4.1 主要评估4.2 效率分析与…

利用OpenShift的ImageStream部署临时版本

公司是港企&#xff0c;项目都部署在OpenShift上统一管理&#xff0c;因为运行环境为香港网络(外网)&#xff0c;配置、中间件等大陆无法直接访问联通。因此在大陆开发时&#xff0c;测试是个很大的问题。为了避免往Git上频繁提交未确定可用的版本&#xff0c;选择用利用OpenSh…

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本&#xff1a; 机器人实体一般价格昂贵&#xff0c;为降低机器人学习、调试的成本&#xff1b;高效&#xff1a; 搭建的环境更为多样且灵活&#xff0c;可以提高测试效率以及测试覆盖率&#xff1b…

【python】python中的argparse模块,教你如何自定义命令行参数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

谁使用DITA?

▲ 搜索“大龙谈智能内容”关注公众号▲ Keith根据LinkedIn上的数据进行的统计&#xff0c;主要反应的西方世界使用DITA的公司。因为LinkedIn在国内不能访问&#xff0c;笔者认为针对中国的数据并不准确。 作者 | John Walker - NXP销售和市场营销业务分析师 2013年4月18日 …

栈实现队列

一、分析 栈的特点是先出再入&#xff0c;而队列的特点为先入先出&#xff0c;所以我们创造两个栈&#xff0c;一个用来存放数据&#xff0c;一个用来实现其它功能此时栈顶为队尾&#xff1b;当要找队头数据时将前n-1个数据移入到另一个栈中&#xff0c;此时剩余那个数据为队头…

ASP.NET网上图书预约系统的设计

摘 要 《网上图书预约系统的设计》是以为读者提供便利为前提而开发的一个信息管理系统&#xff0c;它不仅要求建立数据的一致性和完整性&#xff0c;而且还需要应用程序功能的完备、易用等特点。系统主要采用VB.NET作为前端的应用开发工具&#xff0c;利用SQL Server2000数据…

做题杂记666

[XYCTF2024] 铜匠 题目描述&#xff1a; from Crypto.Util.number import * from secrets import flagm bytes_to_long(flag) m1 getRandomRange(1, m) m2 getRandomRange(1, m) m3 m - m1 - m2def task1():e 149p getPrime(512)q getPrime(512)n p * qd inverse(e,…

VTK官方示例

VTK官方示例 -vtk字體 #!/usr/bin/env python# noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingFreeType # noinspection PyUnresolvedReferences import vtkmodules.vtk…