qt day5 数据库,tcp

news2024/11/20 2:59:18

 数据库

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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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.db
    if(!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.coloradmin.cn/o/971216.html

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

相关文章

Linux命令200例:man用于显示和阅读关于Linux内置命令的使用说明

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

玻璃工艺品可以走墨西哥专线吗?

玻璃工艺品作为一种精美独特的艺术品&#xff0c;经常被人们用来装饰家居或作为礼品赠送。然而&#xff0c;对于想要将这些玻璃工艺品运往墨西哥的商家或个人来说&#xff0c;如何选择最便捷的运输方式成为一个重要的问题。那么&#xff0c;玻璃工艺品可以走墨西哥专线吗? 墨西…

VSCode配置Python以及扩展

无论您是经验丰富的开发人员还是刚刚开始编码冒险&#xff0c;正确设置 VS Code 都可能是将您的技能提升到新水平的秘诀。因此&#xff0c;让我们深入探索在 Visual Studio Code 的虚拟墙内打造崇高编码天堂的艺术&#xff01; 为什么选择 VS 代码&#xff1f; VS Code 已成为 …

探索iVX:颠覆传统低代码平台的新潮流

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

判断对象是否发生变化,常用于监听页面表单是否修改并给出保存提示

本文主要封装方法&#xff0c;实现用户离开表单编辑页面时弹出提示框&#xff0c;若表单数据发生变化&#xff0c;则提示用户是否保存当前页面的信息&#xff0c;如图&#xff1a; 封装方法&#xff1a; /*** 比较俩个对象之间的差异&#xff0c;项目中多处用到监听表单数据是…

一文入门Web网站安全测试

文章目录 Web网页安全风险评估1. 数据泄漏2. 恶意软件传播3. 身份伪装和欺诈 测试Web网页的安全性常见方法和工具漏洞扫描器手动漏洞测试漏洞利用工具Web应用程序防火墙&#xff08;WAF&#xff09;测试渗透测试代码审查社会工程学测试 推荐阅读 Web网页安全风险评估 越来越多…

L1-058 6翻了(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a; 本系列题使用的是&#xff0c;“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度&#xff0c;…

ROS通信机制之动作(Action)服务的实践

1、动作概述 讲完了 服务 之后&#xff0c;接下来就是通信的第三种机制&#xff0c;动作。在上节我们知道服务的应用场景是需要在有限时间内完成&#xff0c;而对于一些比较复杂的任务&#xff0c;需要耗时比较长&#xff0c;甚至是不确定时间的时候&#xff0c;就需要用到动作…

20.添加HTTP模块

添加一个简单的静态HTTP。 这里默认读者是熟悉http协议的。 来看看http请求Request的例子 客户端发送一个HTTP请求到服务器的请求消息&#xff0c;其包括&#xff1a;请求行、请求头部、空行、请求数据。 HTTP之响应消息Response 服务器接收并处理客户端发过来的请求后会返…

尚硅谷SpringMVC (9-13)

九、HttpMessageConverter HttpMessageConverter &#xff0c;报文信息转换器&#xff0c;将请求报文转换为 Java 对象&#xff0c;或将 Java 对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型&#xff1a; RequestBody &#xff0c; ResponseBody &#xff…

如何创建美观的邮件模板并通过qq邮箱的SMTP服务向用户发送

最近在写注册功能的自动发送邮箱告知验证码的功能&#xff0c;无奈根本没有学过前端&#xff0c;只有写Qt的qss基础&#xff0c;只好借助网页设计自己想要的邮箱格式&#xff0c;最终效果如下: 也推销一下自己的项目ShaderLab&#xff0c;可运行ShaderToy上的大部分着色器代码&…

Weblogic漏洞(二)之 Weblogic漏洞环境安装

Weblogic漏洞环境安装 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行Weblogic漏洞环境的安装 安装 docker #更新软件 apt-get update #安装CA证书 apt-get install -y apt-transport-https ca-certificates #安装docker apt install docker.io #查看docker是否安…

【商业案例应用】C端产品设计流程——团购产品案例

文章目录 1、项目背景介绍2、产品前期分析3、产品规划4、总结 1、项目背景介绍 2、产品前期分析 3、产品规划 4、总结

SSH连接安卓手机Termux —— Android手机

文章目录 前言1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 前言 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不过我们可以开启ssh&#xff0c;使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在…

C语言入门 Day_13 二维数组

目录 前言&#xff1a; 1.字符串 2.创建二维数组 3.使用二维数组 4.易错点 5.思维导图 前言&#xff1a; 我们学习了字符类型char&#xff0c;我们可以用char来表示一个大写或者小写的字母&#xff0c;但真实应用中我们往往使用的是多个字符组成的一个单词或者句子。 …

Linux gdb单步调试的原理

文章目录 一、demo演示二、原理分析参考资料 一、demo演示 .section .data message:.string "Hello, World!\n" len . - message.section .text .globl _start _start:# 调用 write() 函数输出 "Hello, World!"mov $1, %rax # 系统调用号为 1…

海域可视化监管:浅析海域动态远程视频智能监管平台的构建方案

一、方案背景 随着科技的不断进步&#xff0c;智慧海域管理平台已经成为海洋领域监管的一种重要工具。相比传统的视频监控方式&#xff0c;智慧海域管理平台通过建设近岸海域视频监控网、海洋环境监测网和海上目标探测网络等&#xff0c;可实现海洋管理的数字化转型。 传统的…

『好书推荐』|《Effective软件测试》

作者简介 《Effective软件测试》 是一本由清华大学出版社出版的图书&#xff0c;作者是[荷]毛里西奥阿尼什&#xff08;Maurcio Aniche&#xff09;&#xff0c;译者是朱少民、李洁、张元。是2023年6月新推出的一本书籍。 Maurcio Aniche博士是荷兰代尔夫特理工大学软件工程系的…

页面页脚部分CSS分享

先看效果&#xff1a; CSS部分&#xff1a;&#xff08;查看更多&#xff09; <style>body {display: grid;grid-template-rows: 1fr 10rem auto;grid-template-areas: "main" "." "footer";overflow-x: hidden;background: #F5F7FA;min…

使用LightPicture开源搭建私人图床:详细教程及远程访问配置方法

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…