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.mzph.cn/news/67502.shtml

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

相关文章

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合&#xff1a;MySQL中的索引事务&#xff08;1&#xff09;索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时&#xff0c;如果你根据name来查询&#xff0c;查到叶子节点得到的只是主键id&#xff0c;还需要通过主键id去主键的B树里面在…

ApiPost7使用介绍 | HTTP Websocket

一、基本介绍 创建项目&#xff08;团队下面可以创建多个项目节点&#xff0c;每个项目可以创建多个接口&#xff09;&#xff1a; 参数描述库&#xff08;填写参数时自动填充描述&#xff09;&#xff1a; 新建环境&#xff08;前置URL、环境变量很有用&#xff09;&#x…

C语言中结构体和位段的一些知识

一、结构体 struct stu {char name[20];//20//对齐数为8int age;//4//两个数中最大对齐数为8&#xff0c;而24又是8的整数倍 }; int main () {printf("%d\n", sizeof(struct stu));//只有vs中有对齐数为8&#xff0c;gcc没有对齐数&#xff0c;对齐数为成员变量自…

SpringBoot - Google EventBus、AsyncEventBus

介绍 EventBus 顾名思义&#xff0c;事件总线&#xff0c;是一个轻量级的发布/订阅模式的应用模式&#xff0c;最初设计及应用源与 google guava 库。 相比于各种 MQ 中间件更加简洁、轻量&#xff0c;它可以在单体非分布式的小型应用模块内部使用&#xff08;即同一个JVM范围…

线上问诊:数仓开发(三)

系列文章目录 线上问诊&#xff1a;业务数据采集 线上问诊&#xff1a;数仓数据同步 线上问诊&#xff1a;数仓开发(一) 线上问诊&#xff1a;数仓开发(二) 线上问诊&#xff1a;数仓开发(三) 文章目录 系列文章目录前言一、ADS1.交易主题1.交易综合统计2.各医院交易统计3.各性…

js+html实现打字游戏v2

实现逻辑&#xff0c;看jshtml实现打字游戏v1&#xff0c;在此基础之上增加了从文件读取到的单词&#xff0c;随机选取10个单词。 效果演示 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…

window系统 bat脚本开启和关闭防火墙

前言 手动去关闭和开启防火墙太麻烦 命令 开始防火墙 netsh advfirewall set allprofiles state on关闭防火墙 netsh advfirewall set allprofiles state off

Maven高级

目录 1.分模块设计与开发 2.继承与聚合 ​编辑 3.私服 资源上传和下载 1.分模块设计与开发 将项目按照功能拆分成若干个子模块&#xff0c;方便项目的管理维护、扩展&#xff0c;也方便模块间的相互调用&#xff0c;资源共享。 分模块设计需要先针对模块功能进行设计&…

Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】

--------UnitTest框架和PyTest框架的简单认识对比与项目实战-------- 定义&#xff1a; Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候也被称为PyUnit&#xff0c;就像JUnit是Java语言的标准单元测试框架一样&#xff0c;Unittest则是Python语言的标…

MySQL——连接查询与子查询

一、连接查询 单表查询&#xff1a;在一张表当中查询数据&#xff0c;叫做单表查询。 连接查询&#xff0c;结合俩&#xff08;多&#xff09;张表&#xff0c;在俩张&#xff08;多&#xff09;表当中查询数据&#xff0c;在一张表当中查询一部分&#xff0c;在另一张表当中…

5个强大的Java分布式缓存框架推荐

在开发中大型Java软件项目时&#xff0c;很多Java架构师都会遇到数据库读写瓶颈&#xff0c;如果你在系统架构时并没有将缓存策略考虑进去&#xff0c;或者并没有选择更优的缓存策略&#xff0c;那么到时候重构起来将会是一个噩梦。 在开发中大型Java软件项目时&#xff0c;很…

C语言之练习题

欢迎来到我的&#xff1a;世界 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言填空题&#xff1a;第一题第二题第三题 编程题&#xff1a;第一题&#xff1a;不用加减乘除做加法第二题&#xff1a;完全数计算第三题&am…

Redis快速入门

文章目录 1. Centos下Redis安装2. redis.conf配置文件介绍3. redis相关命令4. redis封装系统服务5. 问题与解决 1. Centos下Redis安装 Linux_Study 目录&#xff1a;5.2 https://blog.csdn.net/meini32/article/details/128562114 2. redis.conf配置文件介绍 https://blog.c…

【GPT引领前沿】GPT4技术与AI绘图

推荐阅读&#xff1a; 1、遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用 2、GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术 GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程…

ChatGPT AIGC 完成动态堆积面积图实例

先使用ChatGPT AIGC描述一下堆积面积图的功能与作用。 接下来一起看一下ChatGPT做出的动态可视化效果图: 这样的动态图案例代码使用ChatGPT AIGC完成。 将完整代码复制如下: <!DOCTYPE html> <html> <head><meta charset="utf-8"><tit…

Python Flask Web开发二:数据库创建和使用

前言 数据库在 Web 开发中起着至关重要的作用。它不仅提供了数据的持久化存储和管理功能&#xff0c;还支持数据的关联和连接&#xff0c;保证数据的一致性和安全性。通过合理地设计和使用数据库&#xff0c;开发人员可以构建强大、可靠的 Web 应用程序&#xff0c;满足用户的…

Ubuntu系统下使用宝塔面板实现一键搭建Z-Blog个人博客的方法和流程

文章目录 1.前言2.网站搭建2.1. 网页下载和安装2.2.网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测试5.结语 1.前言 Ubuntu系统作…

Ansible之playbook剧本

一、playbook概述1.1 playbook 介绍1.2 playbook 组成部分 二、playbook 示例2.1 playbook 启动及检测2.2 实例一2.3 vars 定义、引用变量2.4 指定远程主机sudo切换用户2.5 when条件判断2.6 迭代2.7 Templates 模块1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设…

算法leetcode|76. 最小覆盖子串(rust重拳出击)

文章目录 76. 最小覆盖子串&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;在这里插入图片描述 题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 76.…

若依新建模块

下面介绍如何在若依框架下新建一个子模块 第一步&#xff1a; 如图操作&#xff1a; 1. 2. 3. 4.在刚建立的子模块的pom.xml文件添加通用工具依赖 代码&#xff1a; <dependencies> <!-- 导入通用工具--><dependency><groupId>com.rchuing&l…