Qt学生管理系统,分为客户端和服务端,通过tcp通信,使用sqlite数据库

//客户端
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
//通信套接字
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include<QTcpSocket>
#include <QTreeWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //显示全部信息
    void showAll();
    //显示树状图
    void showStudentTree();
    void showTeacherTree();
    //解析收到的数据
    void analyseData();
    //插入新的数据
    void insertData();
    //删除数据
    void deleteData();
    //修改数据‘
    void updateData();
    //查找信息
    void searchData();
    //批量导入学生信息
    void importData();

private slots:
    void on_btnConnect_clicked();

    void on_btnSend_clicked();

    void on_btnClose_clicked();

    void on_actionView_triggered();

    void on_actionModif_triggered();

    void on_btnGetClass_clicked();

    void on_btnGet_clicked();

    void on_btnAdd_clicked();

    void on_btnDelete_clicked();

    void on_btnSearch_clicked();

    void on_btnImport_clicked();


    void on_btnGetTeacher_clicked();

    void on_btnUpdate_clicked();

private:
    Ui::MainWindow *ui;
    //通信套接字
    QTcpSocket *tcpSocket;
    QJsonArray jsonArray;
    QJsonObject obj;
    QJsonObject sendJson;
    QJsonDocument jsonDoc;

};
#endif // MAINWINDOW_H

客户端.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QHostAddress>
#include <QJsonObject>
#include<QJsonDocument>
#include<QJsonArray>
#include <QFile>
#include <QDomDocument>
#include<QFileDialog>
#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setWindowTitle("客户端");
    tcpSocket=NULL;
    //分配空间,指定父对象
    tcpSocket=new QTcpSocket(this);
    //
    connect(tcpSocket,&QTcpSocket::connected,[=](){
        ui->textEditRead->setText("成功和服务器建立连接");

    });
    showAll();
    //设置默认显示页面
    ui->stackedWidget->setCurrentIndex(0);
    ui->tabWidget->setCurrentIndex(0);
    //设置窗口大小固定
    window()->setFixedSize(758,607);

}

MainWindow::~MainWindow()
{
    delete ui;
}
//以表格形式显示数据库的信息     使得可以对上面的数据进行操作
void MainWindow::showAll()
{
    //用于存储学生的姓名
    QStringList nameList;
    //年龄数组
    QStringList ageList;
    //班级
    QStringList classList;
    //必须先设置好表格的行列数 不然表格无法显示
    //设置行数
    ui->tableWidget->setRowCount(jsonArray.size());
    //列数
     ui->tableWidget->setColumnCount(3);
     //设置水平表头
     ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"年龄"<<"班级");
    //解析jsonarray
    for(int i=0;i<jsonArray.size();i++){
        QJsonObject json=jsonArray.at(i).toObject();
        //按班级分组
        nameList.append(json.value("姓名").toString());
        ageList.append(json.value("年龄").toString());

        classList.append(json.value("班级").toString());
    }

    for(int i=0;i<jsonArray.size();i++)
    {
        int col=0;
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(ageList[i]));
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(classList[i]));
    }
}
//显示树状图——定义了好多变量
void MainWindow:: showStudentTree()
{
    QStringList listTop;
    QStringList s1;
    QStringList s2;
    QStringList s3;
    QStringList s4;
    QTreeWidgetItem *itemTop1= new QTreeWidgetItem;
    QTreeWidgetItem *itemTop2 = new QTreeWidgetItem;
    QTreeWidgetItem *itemTop3 = new QTreeWidgetItem;
    QTreeWidgetItem *itemTop4 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild1 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild2 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild3 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild4 = new QTreeWidgetItem;
    //用来存储QTreeWidgetItem
    QList<QTreeWidgetItem*> list1;
    QList<QTreeWidgetItem*> list2;
    QList<QTreeWidgetItem*> list3;
    QList<QTreeWidgetItem*> list4;
    for(int i=0;i<jsonArray.size();i++)
    {
        QJsonObject json=jsonArray.at(i).toObject();
        //按班级分组

        QString str=json.value("班级").toString();
        if(str=="1班")
        {
            // s1.append(json.value("学生姓名").toString());
            s1=QStringList(json.value("学生姓名").toString());
            itemTop1=new QTreeWidgetItem(QStringList(str));
            itemChild1 = new QTreeWidgetItem(s1);
            list1.append(itemChild1);

        }
        if(str=="2班")
        {
            s2=QStringList(json.value("学生姓名").toString());
            itemTop2=new QTreeWidgetItem(QStringList(str));
            itemChild2 = new QTreeWidgetItem(s2);
            list2.append(itemChild2);
        }
        if(str=="3班")
        {
            s3=QStringList(json.value("学生姓名").toString());
            itemTop3=new QTreeWidgetItem(QStringList(str));
            itemChild3 = new QTreeWidgetItem(s3);
            list3.append(itemChild3);
        }
        if(str=="4班")
        {
            s4=QStringList(json.value("学生姓名").toString());
            itemTop4=new QTreeWidgetItem(QStringList(str));
            itemChild4 = new QTreeWidgetItem(s4);
            list4.append(itemChild4);
        }
    }
    itemTop1->addChildren(list1);
    itemTop2->addChildren(list2);
    itemTop3->addChildren(list3);
    itemTop4->addChildren(list4);
    ui->treeWidgetClass->addTopLevelItem(itemTop1);
    ui->treeWidgetClass->addTopLevelItem(itemTop2);
    ui->treeWidgetClass->addTopLevelItem(itemTop3);
    ui->treeWidgetClass->addTopLevelItem(itemTop4);
    ui->treeWidgetClass->setHeaderLabels(QStringList()<<"班级");
    ui->treeWidgetClass->expandAll();
}
//显示班级-老师树状图
void MainWindow::showTeacherTree()
{
    QStringList listTop;
    QStringList s1;
    QStringList s2;
    QStringList s3;
    QStringList s4;
    QTreeWidgetItem *itemTop1= new QTreeWidgetItem;
    QTreeWidgetItem *itemTop2 = new QTreeWidgetItem;
    QTreeWidgetItem *itemTop3 = new QTreeWidgetItem;
    QTreeWidgetItem *itemTop4 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild1 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild2 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild3 = new QTreeWidgetItem;
    QTreeWidgetItem *itemChild4 = new QTreeWidgetItem;
    //用来存储QTreeWidgetItem
    QList<QTreeWidgetItem*> list1;
    QList<QTreeWidgetItem*> list2;
    QList<QTreeWidgetItem*> list3;
    QList<QTreeWidgetItem*> list4;
    for(int i=0;i<jsonArray.size();i++)
    {
        QJsonObject json=jsonArray.at(i).toObject();
        //按班级分组

        QString str=json.value("班级").toString();
        if(str=="1班")
        {

            s1=QStringList(json.value("老师姓名").toString()+"    "+json.value("职称").toString());
            itemTop1=new QTreeWidgetItem(QStringList(str));
            itemChild1 = new QTreeWidgetItem(s1);
            list1.append(itemChild1);

        }
        if(str=="2班")
        {
            s2=QStringList(json.value("老师姓名").toString()+"    "+json.value("职称").toString());
            itemTop2=new QTreeWidgetItem(QStringList(str));
            itemChild2 = new QTreeWidgetItem(s2);
            list2.append(itemChild2);
        }
        if(str=="3班")
        {
            s3=QStringList(json.value("老师姓名").toString()+"    "+json.value("职称").toString());
            itemTop3=new QTreeWidgetItem(QStringList(str));
            itemChild3 = new QTreeWidgetItem(s3);
            list3.append(itemChild3);
        }
        if(str=="4班")
        {
            s4=QStringList(json.value("老师姓名").toString()+"    "+json.value("职称").toString());
            itemTop4=new QTreeWidgetItem(QStringList(str));
            itemChild4 = new QTreeWidgetItem(s4);
            list4.append(itemChild4);
        }
    }
    itemTop1->addChildren(list1);
    itemTop2->addChildren(list2);
    itemTop3->addChildren(list3);
    itemTop4->addChildren(list4);
    ui->treeWidgetClass->addTopLevelItem(itemTop1);
    ui->treeWidgetClass->addTopLevelItem(itemTop2);
    ui->treeWidgetClass->addTopLevelItem(itemTop3);
    ui->treeWidgetClass->addTopLevelItem(itemTop4);
    ui->treeWidgetClass->setHeaderLabels(QStringList()<<"班级");
    ui->treeWidgetClass->expandAll();
}
//解析收到的json数据
void MainWindow::analyseData()
{
    connect(tcpSocket,&QTcpSocket::readyRead,[=](){
        //获取对方发送的内容
        QByteArray array=tcpSocket->readAll();
        //转换成jsonobject
        obj=QJsonDocument::fromJson(array).object();
        //转换成jsonarray
        jsonArray=obj.value("data").toArray();

        if(obj.value("type").toString()=="1")
        {
           showStudentTree();
        }
        if(obj.value("type").toString()=="2")
        {
           showTeacherTree();
        }
        if(obj.value("type").toString()=="3")
        {
            showAll();
        }
        if(obj.value("type").toString()=="4")
        {
            showAll();
        }
        if(obj.value("type").toString()=="5")
        {
            showAll();
        }
        if(obj.value("type").toString()=="6")
        {

            showAll();
        }
        if(obj.value("type").toString()=="7")
        {
            showAll();
        }
        if(obj.value("type").toString()=="8")
        {
            showAll();
        }
    });
}
void MainWindow::on_btnConnect_clicked()
{
    //获取服务器端口和ip
    QString ip=ui->lineEditIp->text();
    qint16 port=ui->lineEditPort->text().toInt();
    //主动和服务器建立连接
    tcpSocket->connectToHost(QHostAddress(ip),port);
}

void MainWindow::on_btnSend_clicked()
{

    //获取编辑框内容
    QString str=ui->textEditWrite->toPlainText();
    //发送数据
    tcpSocket->write(str.toUtf8().data());
    //

}

void MainWindow::on_btnClose_clicked()
{
    //主动和服务器断开连接
     tcpSocket->disconnectFromHost();
     tcpSocket->close();

}

void MainWindow::on_actionView_triggered()
{
    ui->stackedWidget->setCurrentIndex(0);
}
//
void MainWindow::on_actionModif_triggered()
{
     ui->stackedWidget->setCurrentIndex(1);

}
//点击显示班级-学生树状图
void MainWindow::on_btnGetClass_clicked()
{
    ui->treeWidgetClass->clear();
    QString type="1";
    sendJson.insert("type",type);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();
    qDebug()<<"显示树状图";
}
//点击显示班级-老师树状图
void MainWindow::on_btnGetTeacher_clicked()
{
    QString type="2";
    sendJson.insert("type",type);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();
}

//显示学生数据库的全部信息,并且可以进行增删查改操作
void MainWindow::on_btnGet_clicked()
{
     ui->tableWidget->clear();
    QString type="3";
    sendJson.insert("type",type);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();
}
//增加数据
void MainWindow::on_btnAdd_clicked()
{
    ui->tableWidget->clear();
    QString type="4";
    //查询的姓名
    QString name=ui->lineEditName->text();
    int age=ui->lineEditAge->text().toInt();
    QString clss=ui->lineEditClass->text();

    sendJson.insert("type",type);
    sendJson.insert("姓名",name);
    sendJson.insert("年龄",age);
    sendJson.insert("班级",clss);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();

}
//删除指定数据
void MainWindow::on_btnDelete_clicked()
{
    QString type="5";
    //根据姓名删除指定数据
    QString name=ui->lineEditName->text();
    sendJson.insert("type",type);
    sendJson.insert("姓名",name);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();
}
//查找指定数据
void MainWindow::on_btnSearch_clicked()
{
    //ui->tableWidget->clear();
    QString type="6";
    //查询的姓名
    QString name=ui->lineEditName->text();
    sendJson.insert("type",type);
    sendJson.insert("姓名",name);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();
}

//修改指定信息
void MainWindow::on_btnUpdate_clicked()
{
     QString type="7";
    //需要传入4个值
    QString rename=ui->lineEdit->text();
    QString name=ui->lineEditName->text();
    int age=ui->lineEditAge->text().toInt();
    QString clss=ui->lineEditClass->text();

    sendJson.insert("type",type);
    sendJson.insert("修改姓名",rename);
    sendJson.insert("姓名",name);
    sendJson.insert("年龄",age);
    sendJson.insert("班级",clss);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();
}
//使用xml批量导入数据
void MainWindow::on_btnImport_clicked()
{
    QJsonArray array;
    QJsonObject obj;
    QString file_path = QFileDialog::getOpenFileName(this, "请选择文件路径...", "./");
    if(file_path.isEmpty())
    {
         qDebug()<<"文件路径为空";
        return;
    }

    QFile file(file_path);
    if(!file.open(QFile::ReadOnly))
    {
        qDebug()<<"文件打开失败";
        return;
    }
    //增加一个一级节点以及元素
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        qDebug()<<"412行 error";
        file.close() ;
        return;
    }
    file.close();

    //根节点
    QDomElement root=doc.documentElement();
    //获得第一个子节点
    QDomNode node=root.firstChild();
    while(!node.isNull())//如果节点不空
    {
        if(node.isElement())//如果节点是元素
        {
            QDomElement e=node.toElement();//转换为元素
            if(!e.isNull())
            {
                if(e.nodeName()=="student")
                {
                    QDomNodeList list=node.childNodes();

                    for(int i=0;i<list.count();i++)
                    {
                        QDomNode newNode=list.at(i);
                        if(newNode.isElement())
                        {

                            if("姓名"==newNode.toElement().tagName())
                            {
                                obj.insert("姓名",newNode.toElement().text());
                            }

                            if("年龄"==newNode.toElement().tagName())
                            {

                                obj.insert("年龄",newNode.toElement().text());
                            }

                            if("班级"==newNode.toElement().tagName())
                            {

                                obj.insert("班级",newNode.toElement().text());
                            }

                        }

                    }
                    array.append(obj);
                }

            }
            node=node.nextSibling();//读取下一个兄弟节点
        }
    }
    QString type="8";

    sendJson.insert("data",array);
    sendJson.insert("type",type);
    jsonDoc.setObject(sendJson);
    tcpSocket->write(jsonDoc.toJson());
    analyseData();
}

服务端头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QTcpServer>
#include<QTcpSocket>
#include<QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct student
{
    //int type;
    int id;
    char name[64];
    int age;
    char clss[64];

};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void sendData();
    //新增学生
    void queryAdd(QString name,int age,QString clss);
    void queryDelete(QString name);
    //查询指定姓名
    void querySearch(QString name);
    void queryUpdate(QString name,QString rename,int age,QString clss);
    //班级--学生
    void showStudentTree();
    //班级-老师-职称
    void showClassTree();
    //显示数据库全部信息
    void showData();
    //批量导入数据
    void queryImport(QJsonObject obj);

private slots:
    //发送按钮槽函数
    void on_btnSend_clicked();

    void on_btnClose_clicked();

private:
    Ui::MainWindow *ui;
    //监听套接字
    QTcpServer *tcpServer;
    //通信套接字
    QTcpSocket *tcpSocket;
    QJsonArray m_jsonArray;
    QJsonObject m_jsonObject;
    QJsonDocument m_jsonDocument;
    QJsonObject m_obj;

};
#endif // MAINWINDOW_H

服务端.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDateTime>
#include <QMessageBox>
#include <QMessageBox>
#include <QSqlDatabase>
#include<QSqlError>
#include<QSqlQuery>
#include <QSqlRecord>
#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpServer=NULL;
    tcpSocket=NULL;
    //监听套接字,指定父对象,让其自动回收空间
    tcpServer=new QTcpServer(this);
    //监听端口
    tcpServer->listen(QHostAddress::Any,8888);
    setWindowTitle("服务器:8888");
    connect(tcpServer,&QTcpServer::newConnection,[=](){
        //取出建立好连接的套接字
        tcpSocket=tcpServer->nextPendingConnection();
        //显示谁和客户端连接 获取客户端ip和端口
        //ip
        QString ip=tcpSocket->peerAddress().toString();
        //port
        qint16 port=tcpSocket->peerPort();

        QString temp=QString("[%1:%2]:成功连接").arg(ip).arg(port);

        ui->textEditRead->setText(temp);
        //当前时间
        QDateTime current_date_time =QDateTime::currentDateTime();
        QString current_date =current_date_time.toString("yyyy-MM-dd hh:mm:ss");

        //接收数据
        connect(tcpSocket,&QTcpSocket::readyRead,[=]()
        {
            //初始化
            m_obj = QJsonObject();
            m_jsonObject = QJsonObject();
            m_jsonArray = QJsonArray();
            //从通信套接字中取出内容
            QByteArray array=tcpSocket->readAll();
            QJsonObject recvObj=QJsonDocument::fromJson(array).object();
            //根据type    判断客户端发送的请求是什么类型
            QString type=recvObj.value("type").toString();
            ui->textEditRead->append(array);
            if( type=="1")
            {
                ui->textEdit->append(current_date+"  "+"获取班级-学生信息");
                showStudentTree();
                sendData();
            }
            if( type=="2")
            {
                ui->textEdit->append(current_date+"  "+"获取班级-老师信息");
                showClassTree();
                sendData();
            }
            //获取学生数据库的全部信息
            if( type=="3")
            {
                ui->textEdit->append(current_date+"  "+"获取学生数据库信息");
                showData();
                sendData();
            }
            //增加数据
            if( type=="4")
            {
                ui->textEdit->append(current_date+"  "+"增加数据");
                QString name=recvObj.value("姓名").toString();
                int age=recvObj.value("年龄").toInt();
                QString clss=recvObj.value("班级").toString();
                queryAdd(name,age,clss);//
                showData();
                sendData();
            }
            //删除指定数据
            if( type=="5")
            {
                ui->textEdit->append(current_date+"  "+"删除数据");
                QString name=recvObj.value("姓名").toString();
                queryDelete(name);
                showData();
                sendData();
            }
            //查找指定数据
            if(type=="6")
            {
                ui->textEdit->append(current_date+"  "+"查找数据");
                QString name=recvObj.value("姓名").toString();
                querySearch(name);
                //showData();
                sendData();
            }
            //修改指定数据
            if(type=="7")
            {
                ui->textEdit->append(current_date+"  "+"修改数据");
                QString rename=recvObj.value("修改姓名").toString();
                QString name=recvObj.value("姓名").toString();
                int age=recvObj.value("年龄").toInt();
                QString clss=recvObj.value("班级").toString();
                queryUpdate(name,rename,age,clss);
                showData();
                sendData();
            }
            //通过xml批量导入数据
            if(type=="8")
            {
                ui->textEdit->append(current_date+"  "+"批量导入数据");
                queryImport(recvObj);
                showData();
                sendData();
            }

        });

    });

    //建立数据库
    QSqlDatabase db= QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("Person.db");

    //打开数据库
    if( !db.open() ) //数据库打开失败
    {
        QMessageBox::warning(this, "错误", db.lastError().text());
        return;
    }

    //操作数据库
    //showStudentTree();

}

MainWindow::~MainWindow()
{
    delete ui;
}
//发送数据
void MainWindow::sendData()
{
    if(tcpSocket==NULL)
    {
        return;
    }
    m_jsonDocument.setObject(m_obj);
    tcpSocket->write(m_jsonDocument.toJson());
}
//新增--插入新的记录
void MainWindow::queryAdd(QString name, int age, QString clss)
{
    QSqlQuery query;
    //查询学生数据库   全部数据
    QString sql=QString("insert into student(name,age,class) values ('%1',%2,'%3') ").arg(name).arg(age).arg(clss);

    query.exec(sql);
}
//删除指定信息
void MainWindow::queryDelete(QString name)
{
    QSqlQuery query;
    //查询学生数据库   全部数据
    QString sql=QString("delete from student where name = '%1' ").arg(name);

        query.exec(sql);

}
//查找指定数据
void MainWindow::querySearch(QString name)
{
    QSqlQuery query;
    //查询学生数据库   全部数据
    QString sql=QString("select * from student where name = '%1'").arg(name);
    query.exec(sql);
    while(query.next())
    {
        //形成了一个json键值对  学生姓名:班级
        //jsonObject.insert("学生编号",query.value(0).toString());
        m_jsonObject.insert("姓名",query.value(1).toString());
        m_jsonObject.insert("年龄",query.value(2).toString());
        m_jsonObject.insert("班级",query.value(3).toString());
        m_jsonArray.append(m_jsonObject);
    }
   // qDebug()<<m_jsonArray;
    //插入数据的类型
    m_obj.insert("type", "6");
    m_obj.insert("data", m_jsonArray);
}
//修改数据库信息
void MainWindow::queryUpdate(QString name, QString rename, int age, QString clss)
{
    QSqlQuery query;
    //查询学生数据库   全部数据
    QString sql=QString("update student set name='%1',age=%2,class='%3' where name='%4' ").arg(name).arg(age).arg(clss).arg(rename);
    query.exec(sql);
    while(query.next())
    {
        //形成了一个json键值对  学生姓名:班级
        //jsonObject.insert("学生编号",query.value(0).toString());
        m_jsonObject.insert("姓名",query.value(1).toString());
        m_jsonObject.insert("年龄",query.value(2).toString());
        m_jsonObject.insert("班级",query.value(3).toString());
        m_jsonArray.append(m_jsonObject);
    }

//    QJsonObject obj;
    //插入数据的类型
    m_obj.insert("type", "7");
    m_obj.insert("data", m_jsonArray);

}
//班级——学生 type 1
void MainWindow::showStudentTree()
{

    QSqlQuery query;
    //查询学生数据库
    QString sql="select  class,name from student group by class,name " ;
    QString str;
    query.exec(sql);
    QSqlRecord rec = query.record();
    while(query.next())
    {

        //形成了一个json键值对  学生姓名:班级
        m_jsonObject.insert("学生姓名",query.value(1).toString());
        m_jsonObject.insert("班级",query.value(0).toString());
        m_jsonArray.append(m_jsonObject);
    }
    //    QJsonObject obj;
    m_obj.insert("type", "1");
    m_obj.insert("data", m_jsonArray);


}
//班级——老师 type 2
void MainWindow::showClassTree()
{
    QSqlQuery query;
    //查询一个班对应的老师
    QString sql="SELECT class.name,teacher.name,teacher.title from class,teacher,teacher_class\n"
            "where teacher_id=teacher.id and class_id=class.id\n"
            "ORDER BY class_id" ;
    query.exec(sql);
    QSqlRecord rec1 = query.record();
    while(query.next())
    {
        m_jsonObject.insert("班级",query.value(0).toString());
        m_jsonObject.insert("老师姓名",query.value(1).toString());
        m_jsonObject.insert("职称",query.value(2).toString());
        m_jsonArray.append(m_jsonObject);
    }
    m_obj.insert("type", "2");
    m_obj.insert("data", m_jsonArray);
}
//显示学生数据库的全部数据  type3
void MainWindow::showData()
{
    QSqlQuery query;
    //查询学生数据库   全部数据
    QString sql="select * from student order by class" ;
    query.exec(sql);
    while(query.next())
    {
        //形成了一个json键值对  学生姓名:班级
        //jsonObject.insert("学生编号",query.value(0).toString());
        m_jsonObject.insert("姓名",query.value(1).toString());
        m_jsonObject.insert("年龄",query.value(2).toString());
        m_jsonObject.insert("班级",query.value(3).toString());
        m_jsonArray.append(m_jsonObject);
    }

//    QJsonObject obj;
    //插入数据的类型
    m_obj.insert("type", "3");
    m_obj.insert("data", m_jsonArray);
}
//批量导入信息
void MainWindow::queryImport(QJsonObject obj)
{
    //遍历
    QSqlQuery query;
    //查询学生数据库   全部数据
    QJsonArray array=obj.value("data").toArray();
    qDebug()<<array;
    for(int i=0;i<array.size();i++){
        QJsonObject json=array.at(i).toObject();
        //按班级分组
        QString name=json.value("姓名").toString();
        QString age=json.value("年龄").toString();
        QString clss=json.value("班级").toString();
        qDebug()<<name<<age<<clss;
        QString sql=QString("insert into student(name,age,class) values ('%1',%2,'%3') ").arg(name).arg(age).arg(clss);
        query.exec(sql);
    }

}

//发送按钮 槽函数
void MainWindow::on_btnSend_clicked()
{   
    sendData();
}

void MainWindow::on_btnClose_clicked()
{
    if(tcpSocket==NULL)
    {
        return;
    }
    //主动和客户端断开连接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket=NULL;
}

写得很垃圾……,看到的人别骂

 

 

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: Qt是一种跨平台的应用程序开发框架,可以用于开发各种类型的应用程序,包括客户端应用程序。要通过Qt客户端访问后台数据库,需要以下步骤: 1. 安装并配置Qt库:在开始之前,需要先下载并安装Qt开发环境,并在项目中配置Qt库。 2. 连接数据库使用Qt提供的数据库模块,可以连接到后台数据库。首先,需要确定所使用数据库类型(例如MySQL、SQLite、PostgreSQL等),然后在Qt代码中添加相应的驱动程序。 3. 进行数据库操作:一旦连接成功,就可以进行各种数据库操作,比如查询、插入、更新、删除等。可以使用Qt提供的SQL语句来执行这些操作,也可以使用ORM(对象-关系映射)框架来简化操作。 4. 处理返回结果:在执行数据库查询时,会返回相应的结果集。可以使用Qt提供的API来处理返回的结果,比如遍历结果集、获取特定字段的值等。 5. 关闭数据库连接:在完成数据库操作后,应记得关闭数据库连接,以释放资源并保证数据的完整性。 总结起来,通过Qt客户端访问后台数据库需要安装配置Qt库,连接数据库,进行数据库操作,处理返回结果,并关闭数据库连接。Qt提供了丰富的功能和工具来简化这些操作,使得开发人员可以更加方便地与后台数据库进行交互。 ### 回答2: Qt 是一个跨平台的开发框架,可以用来开发客户端应用程序。对于一个客户端应用程序来说,它通常需要与服务端进行通信,并且访问后台数据库来获取或更新数据。 在使用 Qt 开发客户端应用程序时,可以通过网络协议与服务端进行通信Qt 提供了多种网络操作类,如 QTcpSocket 和 QNetworkAccessManager,可以使用这些类来建立与服务端的连接,并发送或接收数据。通过与服务端建立的连接,客户端可以将需要查询或更新的数据发送到服务端,并且接收服务端返回的结果。 在服务端,可以使用各种后台数据库来存储和管理数据。常见的后台数据库系统有 MySQL、Oracle、SQL Server 等。客户端可以通过发送 SQL 查询语句到服务端,来获取需要的数据。服务端接收到查询请求后,可以执行相应的 SQL 查询操作,并将查询结果返回给客户端客户端在接收到服务端返回的数据后,可以对数据进行解析和处理,然后在界面上展示给用户。客户端还可以对获取到的数据进行处理、过滤、排序等操作,以符合用户需求。 总之,Qt 客户端通过与服务端建立的连接,可以访问后台数据库,获取或更新数据。这种方式使得客户端应用程序能够与服务端进行灵活的通信,可以实现各种功能和业务需求。 ### 回答3: Qt是一个跨平台的应用程序开发框架,旨在帮助开发者轻松构建功能丰富、高性能的应用程序。Qt框架提供了一套完整的工具和库,以便开发者可以快速开发各种类型的应用程序,包括客户端应用程序。 当一个Qt客户端应用程序需要访问后台数据库时,通常会通过服务端来实现数据访问。这样做的好处是保护了数据库的安全性,因为客户端无法直接访问数据库,只能通过服务端来进行数据的读写操作。 在这种情况下,服务端扮演了一个中间层的角色。它负责接收来自Qt客户端的请求,并将其转发到后台数据库进行处理。服务端会进行数据的验证、授权等操作,以确保客户端只能访问其被允许的数据,并对于敏感数据进行保护。 Qt客户端服务端之间通常会通过网络协议进行通信,例如HTTP、TCP/IP等。客户端通过发送请求的方式向服务端获取或提交数据,并按照服务端返回的数据进行相应的处理。这样可以实现客户端数据库的解耦,允许服务端数据库进行进一步的封装和优化,以提升整体的性能和安全性。 实现Qt客户端通过服务端访问后台数据库的具体步骤如下: 1. 在Qt客户端中,使用Qt提供的网络模块,建立与服务端的连接。 2. 构建请求数据的格式和内容,并发送到服务端。 3. 服务端接收并解析请求,并调用相应的数据库操作方法来处理请求,例如查询、插入、更新等。 4. 服务端将结果封装成响应数据的格式,发送给客户端。 5. 客户端接收到服务端返回的数据,并根据数据的类型和结构进行处理,例如显示在界面上、保存到本地等。 通过这种方式,Qt客户端可以方便地与服务端进行通信,同时也实现了对数据库的访问。这种架构可以提高应用程序的性能、安全性和拓展性,使得开发者可以更好地管理和处理数据。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值