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();}
}

相关文章:
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; …...
基于POSIX标准库的读者-写者问题的简单实现
文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作读者优先实例代码分析写者优先读写公平法示例代码分析实验要求 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别…...
重生我是嵌入式大能之串口调试UART
什么是串口 串口是一种在数据通讯中广泛使用的通讯接口,通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter),其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中,串口常用于与外部设备进…...
【智能优化算法】蜜獾优化算法(Honey Badger Algorithm,HBA)
蜜獾优化算法(Honey Badger Algorithm,HBA)是期刊“MATHEMATICS AND COMPUTERS IN SIMULATION”(IF 3.6)的2022年智能优化算法 01.引言 蜜獾优化算法(Honey Badger Algorithm,HBA)受蜜獾智能觅食行为的启发,从数学上发展出一种求解优化问题的…...
【算法与数据结构】数组
文章目录 前言数组数组的定义数组的基本操作增加元素删除元素修改元素查找元素 C STL 中的数组arrayvector Python3 中的列表访问更改元素值遍历列表检查列表中是否存在某元素增加元素删除元素拷贝列表总结 Python3 列表的常用操作 参考资料写在最后 前言 本系列专注更新基本数…...
【数据结构】队列详解(Queue)
文章目录 有关队列的概念队列的结点设计及初始化队列的销毁判空和计数入队操作出队操作 有关队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端…...
Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息(C#) Baumer工业相机Baumer工业相机NEOAPI SDK和相机Statistics图像传输统计信息的技术背景Baumer工业相机通过NEOAPISDK获取相机的Statistics图像传输统计信息技术1.引…...
FreeRTOS标准库例程代码
1.设备STM32F103C8T6 2.工程模板 单片机: 部分单片机的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代码 1-FreeRTOS移植模板 #include "system.h" #include "…...
wandb: - 0.000 MB of 0.011 MB uploaded持续出现的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
分布式模式让业务更高效、更安全、更稳定
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自热榜文章🔥:探索设计模式的魅力:分布式模…...
5.11学习记录
20长安杯部分 检材 1 的操作系统版本 CentOS Linux 7.6.1810 (Core) 检材 1 中,操作系统的内核版本是 3.10.0-957.el7.x86_64 检材 1 中磁盘包含一个 LVM 逻辑卷,该 LVM 开始的逻辑区块地址(LBA)是 2099200 物理卷ÿ…...
Java类加载器介绍
在Java中,类加载器是一种动态加载类的机制,它负责在运行时查找、加载和链接类文件。当Java应用程序需要创建某个类的对象时,类加载器会在运行时查找该类对应的.class文件,并将其加载到Java虚拟机中。Java类加载器通常分为三层&…...
VC++ PDH/性能计数器
例子: PID0,缺省为当前进程,但最好是获取当前进程ID传递进去,当然也可以选择其它进程的ID。 PerformanceCounter pc; pc.Open(0, "//Processor(_Total)//% Processor Time"); 源实现: #include <windo…...
C++ 类和对象:面向对象编程基础
目录标题 1. 什么是类?2. 什么是对象?3. 如何定义一个类?4. 如何创建对象?5. 类的构造函数6. 类的析构函数7. 数据封装和访问修饰符8. 示例:一个简单的BankAccount类9. 使用g编译10. 再来一个简单的C程序11. 定义书籍类…...
linux 基础命令使用
命令 su 用于切换到另一个用户身份,通常是超级用户(root)。su命令可以用来在命令行下切换用户,也可以在脚本中使用。 语法: su [选项] [用户名] 选项: - -c:执行完命令后,立即退出su命令;…...
eve 导入linux
mkdir /opt/unetlab/addons/qemu/linux-centos7 cd /opt/unetlab/addons/qemu/linux-centos7 上传hda.qcow2 /opt/unetlab/wrappers/unl_wrapper -a fixpermissions Linux images - (eve-ng.net) Due to very high demand of this section and problems with how to crea…...
vivado新版本兼容老版本,vitis classic兼容sdk教程
new version: vivado版本2023.2 和vitisv classic 2023.2 old version: vivado 2018.3以及之前的版本 打开工程 自动升级到当前版本,选择OK 点击Yes,合并当前的目录架构 点击OK 点击Report IP status 勾选要升级的IP核,点击升级 在项目工程文件夹…...
02.02.返回倒数第k个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 k 2 输出: 4 说明: 给定的 k 保证是有效的。 代码ÿ…...
MongoDB 从部署到掌握
一、docker部署MongoDB ## 通过docker安装MongoDB~~~shell #拉取镜像 docker pull mongo:4.0.3#创建容器 docker create --name mongodb-server -p 27017:27017 -v mongodb-data:/data/db mongo:4.0.3 --auth#启动容器 docker start mongodb-server#进入容器 docker exec -it …...
electron-vite工具打包后通过内置配置文件动态修改接口地址实现方法
系列文章目录 electronvitevue3 快速入门教程 文章目录 系列文章目录前言一、实现过程二、代码演示1.resources/env.json2.App.vue3.main/index.js4.request.js5.安装后修改 前言 使用electron-vite 工具开发项目打包完后每次要改接口地址都要重新打包,对于多环境…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
