qt连接tcp通信和连接数据库
通过数据库实现学生管理系统
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库 Studemt.dbif(!db.contains("Student.db")){//添加一个数据库db = QSqlDatabase::addDatabase("QSQLITE"); //表示使用的是sqlite3版本的数据库//给数据库命名db.setDatabaseName("Student.db");}//打开数据库if(!db.open()){QMessageBox::information(this,"提示","数据库打开失败");return;}//此时说明数据库创建完毕并打开//就可以创建数据表了//需要使用SQL语句,需要使用QSQLQuerry类对象完成//准备SQL语句QString sql = "create table if not exists myTable(" //创建表的sql语句"id integer primary key autoincrement," //id主键,允许自增"numb integer," //学号,是整形"name varchar(10)," //姓名 字符串"score integer,""sex varchar(4))"; //性别 字符串//定义语句执行者QSqlQuery querry;//使用queery执行SQL语句if(!querry.exec(sql)){QMessageBox::information(this,"失败","创建表失败");}else{QMessageBox::information(this,"成功","创建表成功");}
}Widget::~Widget()
{delete ui;
}//录入按钮对应的槽函数
void Widget::on_btn1_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->edit1->text().toInt(); //获取学号QString name_ui = ui->edit2->text(); //获取姓名int score_ui = ui->edit3->text().toInt(); //获取分数QString sex_ui = ui->edit4->text(); //获取性别if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0||sex_ui.isEmpty()){QMessageBox::information(this,"提示","请将信息填充完整");return ;}//准备SQL语句QString sql = QString("insert into myTable(numb,name,score,sex)""values(%1,'%2',%3,'%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);//定义语句执行官QSqlQuery querry;//调用执行者的相关函数执行SQL语句if(!querry.exec(sql)){QMessageBox::information(this,"失败","插入失败");}else{QMessageBox::information(this,"成功","插入成功");}
}//展示按钮对应的槽函数
void Widget::on_btn2_clicked()
{//准备SQL语句QString sql = "select * from myTable";//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}//此时将查找的所有结果全都都放在querry对象中//可以通过next函数不断遍历查询结果int i = 0; //记录行号while(querry.next()){//遍历任意一组记录,querry.record//querry.record();//要找到每条一条记录 中的每个数据使用//qDebug() << querry.record().value(2);//返回当前记录对应数据项的个数//querry.record().count();//将记录的某一项的数据转变成了字符串//querry.record().value(2).toString();//将数据库中的表格展示到ui界面//ui->tableWidget->setItem();for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}
}//查找按钮
void Widget::on_btn3_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->edit1->text().toInt(); //获取学号QString name_ui = ui->edit2->text(); //获取姓名int score_ui = ui->edit3->text().toInt(); //获取分数QString sex_ui = ui->edit4->text(); //获取性别if(numb_ui != 0){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where %1 == numb").arg(numb_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}else if(!name_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where '%2' == name").arg(name_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}else if(score_ui != 0){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where %3 == score").arg(score_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}else if(!sex_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where '%4' == sex").arg(sex_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}
}//删除按钮
void Widget::on_btn4_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->edit1->text().toInt(); //获取学号QString name_ui = ui->edit2->text(); //获取姓名int score_ui = ui->edit3->text().toInt(); //获取分数QString sex_ui = ui->edit4->text(); //获取性别if(numb_ui != 0 ){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where %1 == numb").arg(numb_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}//准备SQL语句QString sql1 = "select * from myTable";querry.exec(sql1);int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}else if(!name_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where '%2' == name").arg(name_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}else if(score_ui != 0){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where %3 == score").arg(score_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}else if(!sex_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where '%4' == sex").arg(sex_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}int i = 0; //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++; //进行下一行}}}
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QSqlDatabase> //数据库管理类
#include<QSqlQuery> //执行SQL语句对应的类
#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_btn1_clicked();void on_btn2_clicked();void on_btn3_clicked();void on_btn4_clicked();private:Ui::Widget *ui;//定义一个数据库对象QSqlDatabase db;
};
#endif // WIDGET_H



tcp服务器
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给服务器指针实例化对象server = new QTcpServer(this);
}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_btn_clicked()
{//获取ui界面上的端口号quint16 port = ui->edit->text().toUInt();if(!server->listen(QHostAddress::Any,port)){QMessageBox::critical(this,"失败","服务器启动失败");return;}else{QMessageBox::information(this,"成功","服务器启动成功");}connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}//处理的newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug() << "有新的客户端发来连接请求";QTcpSocket *s = server->nextPendingConnection();//将获取的套接字存放到客户端容器中clientList.push_back(s);connect(s,&QTcpSocket::readyRead,this,&Widget::redyRead_slot);
}//关于readyRead信号的槽函数
void Widget::redyRead_slot()
{//删除客户端链表中的无效客户端套接字for(int i=0;i<clientList.count();i++){if(clientList[i]->state() == 0){clientList.removeAt(i); // 将下标为i的客户端移除掉}}//遍历所有客户端,查看是哪个客户端发来数据for(int i=0;i<clientList.count();i++){if(clientList[i]->bytesAvailable() != 0){QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面上ui->msglist->addItem(QString::fromLocal8Bit(msg));//接接受的消息发送到所有客户端,发送给所有客户端for(int j=0;j<clientList.count();j++){clientList[j]->write(msg);}}}
}
tcp客户端
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//客户端指针实例化空间socket = new QTcpSocket(this);connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_btn2_clicked()
{//获取ui界面的信息userName = ui->edit2->text(); //获取用户名QString hostName = ui->edit3->text(); //获取主机地址quint16 port= ui->edit4->text().toUInt(); //获取端口号socket->connectToHost(hostName,port);}void Widget::connected_slot()
{QMessageBox::information(this,"成功","连接服务器成功");//顺便向服务器发送一条信息QString msg = userName + ":进入聊天室";socket->write(msg.toLocal8Bit());
}//关于readyRead信号的槽函数
void Widget::readyRead_slot()
{//读取该客户端中的数据QByteArray msg = socket->readAll();//将数据展示在ui界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}//发送消息
void Widget::on_btn1_clicked()
{//获取ui界面中编辑文本的内容QString m = ui->edit1->text();//整合要发送的信息QString msg = userName + ":" + m;//将消息发送给服务器socket->write(msg.toLocal8Bit());//将消息编辑框中的内容清空ui->edit1->clear();
}//断开服务器
void Widget::on_btn3_clicked()
{//准备要发送的信息QString msg = userName + ":离开聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();}void Widget::disconnected_slot()
{QMessageBox::information(this,"退出","退出成功");
}

相关文章:
qt连接tcp通信和连接数据库
通过数据库实现学生管理系统 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库 Studemt.dbif(!db.co…...
MySQL Oracle区别
由于SQL Server不常用,所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL语…...
Figma实用插件速收藏!精选19个干货插件大公开!
Figma 如今有着大量的插件,在 UI/UX 设计领域,很多工作已经不用真的从零开始做了。用好 Figma 插件,往往能让设计工作事半功倍。不过其中的插件素质差别很大,需要仔细筛选。不过如果你选择了对的插件,合理的设置&#…...
【STM32】FSMC—扩展外部 SRAM 初步使用 1
基于野火指南者《零死角玩转 STM32F103—指南者》的学习 STM32F103系列 FSMC Flexible Static Memory Controller简介 1.详细功能参看《STM32F10x参考手册》,这边是概述 是一个外设,挂载在AHB总线下。 可以用于驱动包括 SRAM、NOR FLASH 以及 NAND FL…...
保姆级教程 --redis启动命令
1、在redis目录 打开命令 windowr 输入cmd 2、输入 redis-server.exe redis.windows.conf 启动redis命令,看是否成功 3、可能会启动失败,报28 Nov 09:30:50.919 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 4、报错后&am…...
【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )
文章目录 一、构造函数分类1、构造函数分类简介2、构造函数分类代码分析无参构造函数有参构造函数拷贝构造函数 二、代码示例 - 三种类型构造函数定义与调用 一、构造函数分类 1、构造函数分类简介 C 构造函数可以分为以下几类 : 无参构造函数 : 最简单也是默认的构造函数 , 函…...
胡焕庸线,我国东西地级市分布密度分界线
背景 黑河—腾冲线,又名胡焕庸线,是我国人口密度分布的东西近似分界线。今天把地级市坐标分布密度做成热力图,并与胡焕庸线一起展示时,惊奇的发现,胡焕庸线貌似也是我车东西地级市分布密度的分界线。 生成folium地图…...
里氏替换原则在继承关系中子类对父类方法的重写(覆盖)或重载时应遵循的规则
什么是里氏替换原则:只要父类能出现的地方子类就可以出现,而且 替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。…...
【脑机接口开源数据处理包】brainflowBrainFlow是一个库,旨在获取,解析和分析脑电图,肌电图,心电图和其他类型的数据从生物传感器。
BrainFlow是一个库,旨在获取,解析和分析脑电图,肌电图,心电图和其他类型的数据从生物传感器。 brainflow开源库官网地址 [https://brainflow.readthedocs.io/en/stable/](https://brainflow.readthedocs.io/en/stable/) 它提供了…...
#452. 序列操作
序列操作 - 题目 - Daimayuan Online Judge 问题描述: 思路:首先想的是第二次操作的y可以将前面所以操作进行抵消,只需要第二次操作的最大值即可。但是发现,对于第一个操作,它是单点修改,每修改一次对于第…...
《Python深度学习-Keras》精华笔记3:解决深度学习多分类问题
公众号:机器学习杂货店作者:Peter编辑:Peter 持续更新《Python深度学习》一书的精华内容,仅作为学习笔记分享。 本文是第三篇:介绍如何使用Keras解决Python深度学习中的多分类问题。 多分类问题和二分类问题的区别注意…...
区块链世界的大数据入门之zkMapReduce简介
1. 引言 跨链互操作性的未来将围绕多链dapp之间的动态和数据丰富的关系构建。Lagrange Labs 正在构建粘合剂,以帮助安全地扩展基于零知识证明的互操作性。 2. ZK大数据栈 Lagrange Labs 的ZK大数据栈 为一种专有的证明结构,用于在任意动态分布式计算的…...
Python流程控制语句-条件判断语句练习及应用详解
文章目录 简介条件判断语句(if语句)练习1:判断奇偶数练习2:判断闰年练习3:计算狗的年龄相当于人的年龄练习4:根据成绩奖励练习5:选择婚姻对象 小结 python 学习专栏推荐python基础知识ÿ…...
(十)ElasticSearch高级使用【别名,重建索引,refresh操作,高亮查询,查询建议】
1.别名使用 1)别名作用 在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了 适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整&…...
基于小波神经网络的中药材价格预测,基于ANN的小波神经网络中药材价格预测
目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 小波神经网络(以小波基为传递函数的BP神经网络) 代码链接:基于小波神经网络的中药材价格预测,ANN小波神经网络中药材价格预测资源-CS…...
thinkPhp5返回某些指定字段
//去除掉密码$db new UserModel();$result $db->field(password,true)->where("username{$params[username]} AND password{$params[password]}")->find(); 或者指定要的字段的数组 $db new UserModel();$result $db->field([username,create_time…...
基于docker环境的tomcat开启远程调试
背景: Tomcat部署在docker环境中,使用rancher来进行管理,需要对其进行远程调试。 操作步骤: 1.将容器中的catalina.sh映射出来,便于对其修改,添加远程调试相关参数。 注意:/data/produce2201…...
ELK日志框架图总结
ELK日志框架图总结 本文目录 ELK日志框架图总结Elastic Stack介绍模式分层图beatselasticsearchkibana模式logstashelasticsearchkibana模式beatslogstashelasticsearchkibana模式beats缓存/消息队列logstashelasticsearchkibana模式elkspringboot Elastic Stack介绍 官网&…...
go 每天定时任务 --chatGPT
问:clearLog(hour,cmds),定时执行shell 命令,hour 为每天的几点,cmds 为linux命令数组字符串(如 1,{"ls","cd"}) gpt: 要编写一个 Go 函数 clearLog,该函数可…...
Lightdb 23.3 plorasql函数支持DML
开篇立意 oracle在函数中使用dml语句时,有两者情况。即:(1)直接使用select调用该函数;(2)在匿名块中调用该函数。 针对第一种情况我们测试一下 简单的函数: create table nested_t…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
