qt day5 数据库,tcp

 数据库

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>//数据库管理类
#include <QSqlRecord>//记录类
#include <QSqlQuery>//执行sql语句对应的类
#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_inputbtn_clicked();void on_showbtn_clicked();void on_searchbtn_clicked();void on_deletebtn_clicked();private:Ui::Widget *ui;//定义一个数据库对象QSqlDatabase db;
};
#endif // WIDGET_H

 widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//判断 数据库对象是否包含了自己使用的数据库student.dbif(!db.contains("student.db")){//添加一个数据库//函数原型:static QsqlDatabase addDatabase(const Qstring& type);//参数:数据库的版本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;//使用querry执行sql语句if(!querry.exec(sql)){QMessageBox::information(this,"失败","创建表失败");}else{QMessageBox::information(this,"成功","创建表成功");}
}Widget::~Widget()
{delete ui;
}//录入按钮对应的槽函数
void Widget::on_inputbtn_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui=ui->numEdit->text().toUInt();   //获取ui界面的学号QString name_ui=ui->nameEdit->text();   //获取ui界面上的新名int score_ui = ui->scoreEdit->text().toInt();   //获取ui界面上的成绩QString sex_ui= ui->sexEdit->text();        //获取ui界面上的性别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);//Qstring s1 = Qstring("%61,%2,9%3").arg(526).arg(3.14).arg("I love China");//定义语句执行官QSqlQuery querry;//调用执行者的相关函数执行sql语句if(!querry.exec(sql)){QMessageBox ::information(this,"失败","插入数据失败");}else{QMessageBox ::information(this,"成功","数据录入成功");}}
//展示按钮对应的槽函数
void Widget::on_showbtn_clicked()
{//准备sql语句QString sql = "select * from myTable";//准备语句执行者QSqlQuery querry;//执行sql语句if(!querry.exec(sql)){QMessageBox ::information(this ,"失败","查询失败");return;}//此时,将查找到的所有结果,全部都放在querry对象中了//可以通过next函数不断遍历查询结int i=0;  //记录行号while(querry.next()){//遍历的就是任意一组记录:querry.record// querry.record();// qDebug()<<querry .record()//要找到每条记录中的每个数据使用querry.record().value(i)//qDebug()<<querry.record().value(2);// querry.record().value();//返回当前记录对应数据项的个数// 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_searchbtn_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->numEdit->text().toInt();            //获取学号QString name_ui = ui->nameEdit->text();                //获取姓名int score_ui = ui->scoreEdit->text().toInt();           //获取分数QString sex_ui = ui->sexEdit->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_deletebtn_clicked()
{int numb_ui = ui->numEdit->text().toInt();QString name_ui = ui->nameEdit->text();int score_ui = ui->scoreEdit->text().toInt();QString sex_ui = ui->sexEdit->text();if (numb_ui != 0) {QString sql = QString("delete from myTable where %1 = numb").arg(numb_ui);QSqlQuery query;if (!query.exec(sql)) {QMessageBox::information(this, "失败", "删除失败");return;} else {QMessageBox::information(this, "成功", "删除成功");}} else if (!name_ui.isEmpty()) {QString sql = QString("delete from myTable where '%1' = name").arg(name_ui);QSqlQuery query;if (!query.exec(sql)) {QMessageBox::information(this, "失败", "删除失败");return;} else {QMessageBox::information(this, "成功", "删除成功");}} else if (score_ui != 0) {QString sql = QString("delete from myTable where %1 = score").arg(score_ui);QSqlQuery query;if (!query.exec(sql)) {QMessageBox::information(this, "失败", "删除失败");return;} else {QMessageBox::information(this, "成功", "删除成功");}} else if (!sex_ui.isEmpty()) {QString sql = QString("delete from myTable where '%1' = sex").arg(sex_ui);QSqlQuery query;if (!query.exec(sql)) {QMessageBox::information(this, "失败", "删除失败");return;} else {QMessageBox::information(this, "成功", "删除成功");}}//清空ui->tableWidget->clear();//准备sql语句QString sql = "select * from myTable";//准备语句执行者QSqlQuery querry;querry.exec(sql);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++;                             //进行下一行}
}

服务器:

#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_btn1_clicked()
{//获取ui上的端口号quint16 port=ui->portEdit->text().toUInt();if(!server->listen(QHostAddress::Any,port)){QMessageBox::critical(this,"失败","服务器启动失败");return;}else{QMessageBox::information(this,"成功","服务器启动成功");}connect(server,&QTcpServer::newConnection,this,&Widget::newconnection_slot);}//处理newconneion信号的槽函数
void Widget::newconnection_slot()
{qDebug()<<"新的客户端发来连接请求了" ;QTcpSocket *s=server->nextPendingConnection();//将获取的套接字存放到客户端中clientList.push_back(s);connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);}//处理readRead信号的槽函数
void Widget::readyRead_slot()
{for(int i=0;i<clientList.count();i++){if(clientList[i]->state()==0){clientList.removeAt(i);}}for(int i=0;i<clientList.count();i++){if(clientList[i]->bytesAvailable()!=0){QByteArray msg=clientList[i]->readAll();ui->msglist->addItem(QString::fromLocal8Bit(msg));for(int j=0;j<clientList.count();j++){clientList[j]->write(msg);}}}}

 客户端

#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_connectbtn_clicked()
{//获取ui界面的信息userName =ui->usernameEdit->text();//获取用户名QString hostName= ui->ipEdit->text();//获取主机地址quint16 port = ui->portEdit->text().toUInt();//获取端口号socket->connectToHost(hostName,port);
}//关于connected信号的槽函数的定义
void Widget::connected_slot()
{
QMessageBox::information (this,"成功","连接服务器成功");QString msg = userName + ":进入聊天室";socket->write(msg.toLocal8Bit()) ;}//关于readRead信号对应槽函数的实现
void Widget::readyRead_slot()
{//读取该客户端中的数据QByteArray msg = socket-> readAll();//将数据展示在ui界面ui->msglist->addItem(QString::fromLocal8Bit(msg));
}//发送按钮对应的槽函数
void Widget::on_sendbtn_clicked()
{//获取ui界面中的编辑的文本内容QString m=ui->msgEdit->text();//整合要发送的信息QString msg=userName+":"+m;//将消息发送给服务器socket->write(msg.toLocal8Bit());//将消息编辑框中的内容清空ui->msgEdit->clear( ) ;}
//断开服务器按钮对应的槽函数
void Widget::on_disconnectbtn_clicked()
{//准备要发送的信息QString msg=userName+":离开聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();}//disconnected信号对应的槽函数实现
void Widget::disconnected_slot()
{QMessageBox::information(this,"退出","断开成功");
}

 

 

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

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

相关文章

K8S:二进制部署K8S(两台master+负载均衡nginx+keepalived)

文章目录 一.常见的K8S部署方式1.Minikube2.Kubeadmin3.二进制安装部署 二.二进制搭建K8S(双台master)1.部署架构规划2.系统初始化配置3.部署 docker引擎4.部署 etcd 集群&#xff08;1&#xff09;etcd简介&#xff08;2&#xff09;准备签发证书环境&#xff08;3&#xff09…

企业文件数据透明加密保护——防泄密软件系统

天锐绿盾电脑文件数据透明加密、防泄密系统是一款全面的加密软件系统&#xff0c;主要从源头上保障数据安全和使用安全。该系统采用文件过滤驱动实现透明加解密&#xff0c;对用户完全透明&#xff0c;不影响用户操作习惯&#xff0c;从源头上保障企业数据安全。通过对电子文档…

MLOps:掌握机器学习部署:Docker、Kubernetes、Helm 现代 Web 框架

介绍&#xff1a; 在机器学习的动态世界中&#xff0c;从开发模型到将其投入生产的过程通常被认为是复杂且多方面的。 然而&#xff0c;随着 Docker、Kubernetes 等工具以及 FastAPI、Streamlit 和 Gradio 等用户友好的 Web 框架的出现&#xff0c;这一过程变得比以往更加简化…

Windows和Linux环境中安装Zookeeper具体操作

1.Windows环境中安装Zookeeper 1.1 下载Zookeeper安装包 ZooKeeper官网下载地址 建议下载稳定版本的 下载后进行解压后得到如下文件&#xff1a; 1.2 修改本地配置文件 进入解压后的目录&#xff0c;将zoo_example.cfg复制一份并重命名为zoo.cfg,如图所示&#xff1a; 打…

Java的23种设计模式

Java的23种设计模式 一、创建型设计模式1.单例模式 singleton1.1.静态属性单例模式1.2 静态属性变种1.3 基础的懒汉模式1.4 线程安全的懒加载单例1.5 线程安全的懒加载 单例-改进1.6 双重检查锁1.7 静态内部类1.8 枚举单例1.9 注册表单例 2.工厂方法模式 factory3.抽象工厂模式…

【力扣】304. 二维区域和检索 - 矩阵不可变 <二维前缀和>

目录 【力扣】304. 二维区域和检索 - 矩阵不可变二维前缀和理论初始化计算面积 题解 【力扣】304. 二维区域和检索 - 矩阵不可变 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, …

因为axios请求后端,接收不到token的问引出的问题

vue axios请求后端接受不到token的问题。 相关概念 什么是跨域&#xff1f; 跨域指的是在浏览器环境下&#xff0c;当发起请求的域&#xff08;或者网站&#xff09;与请求的资源所在的域之间存在协议、主机或端口中的任何一个条件不同的情况。换句话说&#xff0c;只要协议、…

算法笔记 近似最近邻查找(Approximate Nearest Neighbor Search,ANN)

1 介绍 精准最近邻搜索中数据维度一般较低&#xff0c;所以会采用穷举搜索&#xff0c;即在数据库中依次计算其中样本与所查询数据之间的距离&#xff0c;抽取出所计算出来的距离最小的样本即为所要查找的最近邻。 当数据量非常大的时候&#xff0c;搜索效率急剧下降。——>…

C语言:选择+编程(每日一练Day15)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;寻找奇数 思路一&#xff1a; 题二&#xff1a;寻找峰值 思路一&#xff1a; 本人实力有限可能对一些地方解…

软件架构设计(三) B/S架构风格-层次架构(一)

层次架构风格从之前的两层C/S到三层C/S,然后演化为三层B/S架构,三层B/S架构之后仍然在往后面演化,我们来看一下层次架构演化过程中都有了哪些演化的架构风格呢? 而我们先简单了解一下之前的层次架构风格中分层的各个层次的作用。 表现层:由于用户进行交互,比如MVC,MVP,…

桌面平台层安全随手记录

声明 本文是学习桌面云安全技术要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 桌面平台层安全 桌面接入安全 用户标识 一般要求 本项要求包括&#xff1a; a) 系统应为用户提供唯一的身份标识&#xff0c;同时将用户的身份标识与该用户的所…

31 WEB漏洞-文件操作之文件包含漏洞全解

目录 文件包含漏洞原理检测类型利用修复 本地包含-无限制&#xff0c;有限制远程包含-无限制&#xff0c;有限制各种协议流玩法文章介绍读取文件源码用法执行php代码用法写入一句话木马用法每个脚本支持的协议玩法 演示案例某CMS程序文件包含利用-黑盒CTF-南邮大&#xff0c;i春…