【QT】实现UI界面与数据库交互(增 删 改)

这篇博客详细介绍了如何使用QT框架,通过UI界面实现与数据库的交互,包括增加、删除和修改数据的功能。涉及到的文件包括application.pro、addstudlg.h、createdb.h等,覆盖了项目的各个部分,如主窗口、学生管理器和教师管理器的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

application.pro

addstudlg.h

createdb.h

mainwindow.h

 StuManager.h 

TeacherManager.h 

main.cpp

mainwindow.cpp 

 StuManager.cpp 

TeacherManager.cpp 

addstudlg.cpp 

createdb.cpp 


application.pro

#-------------------------------------------------
#
# Project created by WHS-NARI GROUP 2022/03/22
#
#-------------------------------------------------

QT       += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Application
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    StuManager.cpp \
    TeacherManager.cpp \
    addstudlg.cpp \
    createdb.cpp \

HEADERS  += mainwindow.h \
    StuManager.h \
    TeacherManager.h \
    addstudlg.h \
    createdb.h \

FORMS    += mainwindow.ui \
    StuManager.ui \
    TeacherManager.ui \
    addstudlg.ui

addstudlg.h

#ifndef ADDSTUDLG_H
#define ADDSTUDLG_H

#include <QDialog>
#include <QVariantMap>

namespace Ui {
class AddStuDlg;
}

class AddStuDlg : public QDialog
{
    Q_OBJECT

public:
    explicit AddStuDlg(QWidget *parent = 0);
    ~AddStuDlg();

    void setEditData(QStringList rowData);

private:
    void clearData();

    void closeEvent(QCloseEvent *event);

private slots:
    void on_buttonBox_accepted();

    void on_buttonBox_rejected();

signals:
    void signalStuInfo(QVariantMap stuInfo);

private:
    Ui::AddStuDlg *ui;

};

#endif // ADDSTUDLG_H

createdb.h

#ifndef CREATEDB_H
#define CREATEDB_H

#include <QList>
#include <QStringList>

class CreateDb
{
public:
    CreateDb();

    void initDB();

    QList<QStringList> selectDataFromBase();

};

#endif // CREATEDB_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTabWidget>
#include "StuManager.h"
#include "TeacherManager.h"
#include "createdb.h"
#include "addstudlg.h"


namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

    enum OperateType
    {
        Add ,
        Edit
    };

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void onBtnAdd();

    void onBtnEdit();

    void onBtnDel();

    void onBtnRefresh();

    void ExecAddSql(QVariantMap stuInfo);

    void ExecEditSql(QVariantMap stuInfo);

    void ExecDelSql(QString id);

private:
    void initUi();

    void setTabCornerBtn();

    void initAddDlg();

private:
    Ui::MainWindow *ui;
    QTabWidget *m_pTabWidget;

    StuManager *m_pTableWidget;
    TeacherManager *m_pTeacherManager;

    CreateDb *m_pCreateDb;
    AddStuDlg* m_pAddStuDlg;

    OperateType m_operateType;
};

#endif // MAINWINDOW_H

 StuManager.h 

#ifndef TABLEWIDGET_H
#define TABLEWIDGET_H

#include <QWidget>

namespace Ui {
class StuManager;
}

class StuManager : public QWidget
{
    Q_OBJECT

public:
    explicit StuManager(QWidget *parent = 0);
    ~StuManager();

    void appendRowData(QStringList rowData); //添加一行数据

    void clearTableData(); //清除表格数据

    QStringList getCurrentRowData();

    QString getCurrentID();

private:
    Ui::StuManager *ui;
};

#endif // TABLEWIDGET_H

TeacherManager.h 

#ifndef TEACHERMANAGERWIDGET_H
#define TEACHERMANAGERWIDGET_H

#include <QWidget>

namespace Ui {
class TeacherManager;
}

class TeacherManager : public QWidget
{
    Q_OBJECT

public:
    explicit TeacherManager(QWidget *parent = 0);
    ~TeacherManager();

private:
    Ui::TeacherManager *ui;
};

#endif // TEACHERMANAGERWIDGET_H



main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QFile>
#include <QTextCodec>
#include <QCoreApplication>
#include <QFont>
#include <QTextStream>

int main(int argc, char *argv[])
{
    QTextCodec *pCodec = QTextCodec::codecForName("GBK");
    if(pCodec)
    {
        QTextCodec::setCodecForLocale(pCodec);
    }

    QCoreApplication::setApplicationName("StuTest");//设置应用名称

    QApplication a(argc, argv);

    QFile file("../Styles/white.qss");
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(&file);
        QString style = in.readAll();
        file.close();
        qApp->setStyleSheet(style);
    }

    QFont serifFont("Times", 12, QFont::Thin);
    a.setFont(serifFont);

    MainWindow w;
    w.setWindowTitle(QObject::tr("管理系统"));
    w.show();

    return a.exec();
}

mainwindow.cpp 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QObject>
#include <QHBoxLayout>
#include <QPushButton>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QMessageBox>

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

    initUi();

    initAddDlg();

    setTabCornerBtn();

    m_pCreateDb = new CreateDb;

    m_pCreateDb->initDB();  //打开数据库

    onBtnRefresh(); //程序启动时,查询数据

    showMaximized();

    m_operateType = Add;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onBtnAdd()
{
    qDebug()<<"onBtnAdd";
    m_operateType = Add;
    if(m_pAddStuDlg)
    {
        m_pAddStuDlg->activateWindow();
        m_pAddStuDlg->setWindowTitle(tr("添加: 学生信息"));
        m_pAddStuDlg->exec();
    }
}

void MainWindow::onBtnEdit()
{
    qDebug()<<"onBtnEdit";

    m_operateType = Edit;

    QStringList rowData ;
    rowData = m_pTableWidget->getCurrentRowData();
    if(rowData.isEmpty())
    {
        QMessageBox::information(this, tr("提示") , tr("请选中需要编辑的数据!"));
        return ;
    }
    else
    {
        m_pAddStuDlg->setEditData(rowData);
    }

    m_pAddStuDlg->activateWindow();
    m_pAddStuDlg->setWindowTitle(tr("修改: 学生信息"));
    m_pAddStuDlg->exec();
}

void MainWindow::onBtnDel()
{
    qDebug()<<"onBtnDel";
    QString ID = m_pTableWidget->getCurrentID();
    if(ID.isEmpty())
    {
        QMessageBox::information(this , tr("提示") , tr("请选中一条记录!"));
        return ;
    }

    QMessageBox::StandardButton button = QMessageBox::question(this , tr("提示") ,tr("确定删除这一条记录?"));
    if(button == QMessageBox::Yes)
    {
        //删除操作
        ExecDelSql(ID);
    }
}

void MainWindow::onBtnRefresh()
{
    qDebug()<<"onBtnRefresh";
    QList<QStringList> tableData;

    tableData = m_pCreateDb->selectDataFromBase();  //读取数据表中的数据到容器tableData
    if(!tableData.isEmpty())
    {
        m_pTableWidget->clearTableData();
        QListIterator<QStringList> itr(tableData);  //QListIterator迭代器 遍历输出list的内容
        while(itr.hasNext())
        {
            m_pTableWidget->appendRowData(itr.next());
        }
    }
}

void MainWindow::ExecAddSql(QVariantMap stuInfo)
{
    if(m_operateType == Add)
    {
        QString create_date = stuInfo.value("datetime").toString();
        QString id = stuInfo.value("number").toString();
        QString name = stuInfo.value("name").toString();
        QString sex = stuInfo.value("sex").toString();
        QString age = stuInfo.value("age").toString();
        QString address = stuInfo.value("address").toString();
        QString phone = stuInfo.value("phone").toString();
        QString description = stuInfo.value("desc").toString();

        QString sql;
        sql = QString("insert into StuManager (create_date,id ,name ,sex ,age ,address , phone ,description)"
                      " VALUES ('%1', '%2' , '%3' , '%4' , '%5' , '%6' , '%7' , '%8')")
                .arg(create_date).arg(id).arg(name).arg(sex).arg(age).arg(address).arg(phone).arg(description);

        QSqlQuery query;
        bool ok = query.exec(sql);
        if(ok)
        {
            QStringList rowData;
            rowData << name <<id <<sex <<age << address <<phone << description ;
            m_pTableWidget->appendRowData(rowData);

            QMessageBox::information(this ,tr("提示") , tr("添加成功!"));
        }
        else
        {
            QMessageBox::information(this ,tr("提示") , tr("添加失败!"));
        }
    }
}

void MainWindow::ExecEditSql(QVariantMap stuInfo)
{
    if(m_operateType == Edit)
    {
        QString create_date = stuInfo.value("datetime").toString();
        QString id = stuInfo.value("number").toString();
        QString name = stuInfo.value("name").toString();
        QString sex = stuInfo.value("sex").toString();
        QString age = stuInfo.value("age").toString();
        QString address = stuInfo.value("address").toString();
        QString phone = stuInfo.value("phone").toString();
        QString description = stuInfo.value("desc").toString();

        QString sql;
        sql = QString("UPDATE StuManager "
                      "set create_date = '%0' ,id = '%2' ,name = '%3',"
                      "sex = '%4',age = '%5',address = '%6', phone = '%7',description = '%8'"
                      " where id = '%9' ")
                .arg(create_date).arg(id).arg(name).arg(sex).arg(age).arg(address).arg(phone).arg(description).arg(id);

        QSqlQuery query;
        bool ok = query.exec(sql);
        if(ok)
        {
            onBtnRefresh(); //重新加载数据
            QMessageBox::information(this ,tr("提示") , tr("修改成功!"));
        }
        else
        {
            QMessageBox::information(this ,tr("提示") , tr("修改失败!"));
        }
    }
}

void MainWindow::ExecDelSql(QString id)
{
    QString sql;
    sql = QString("DELETE FROM StuManager "
                  " where id = '%9' ").arg(id);

    QSqlQuery query;
    bool ok = query.exec(sql);
    if(ok)
    {
        onBtnRefresh(); //重新加载数据
        QMessageBox::information(this ,tr("提示") , tr("删除成功!"));
    }
    else
    {
        QMessageBox::information(this ,tr("提示") , tr("删除失败!"));
    }
}

void MainWindow::initUi()
{
    m_pTableWidget = new StuManager;
    m_pTeacherManager = new TeacherManager;

    m_pTabWidget = new QTabWidget(this);

    m_pTabWidget->addTab(m_pTableWidget , tr("学生管理"));  //增加选项卡
    m_pTabWidget->addTab(m_pTeacherManager ,tr("教师管理"));

    setStyleSheet("QTabBar::tab{min-width:30ex; min-height:10ex;}");

    setCentralWidget(m_pTabWidget);
    setContentsMargins(5 , 10, 5 ,5);
}

void MainWindow::setTabCornerBtn()   //设置界面按钮
{
    QPushButton *btnRefresh = new QPushButton;
    btnRefresh->setText(tr("刷新"));

    QPushButton *btnAdd = new QPushButton;
    btnAdd->setText(tr("添加"));

    QPushButton *btnEdit = new QPushButton;
    btnEdit->setText(tr("编辑"));

    QPushButton *btnDel = new QPushButton;
    btnDel->setText(tr("删除"));

    QWidget *widget = new QWidget;
    widget->setMinimumSize(20 ,55);
    widget->setContentsMargins(0,0,0,10);

    QHBoxLayout *hLayout = new QHBoxLayout(widget);
    hLayout->addWidget(btnRefresh);
    hLayout->addWidget(btnAdd);
    hLayout->addWidget(btnEdit);
    hLayout->addWidget(btnDel);

    widget->setLayout(hLayout);
    m_pTabWidget->setCornerWidget(widget ,Qt::TopRightCorner);

    connect(btnRefresh , SIGNAL(clicked(bool)) , this ,SLOT(onBtnRefresh()));
    connect(btnAdd , SIGNAL(clicked(bool)) , this ,SLOT(onBtnAdd()));
    connect(btnEdit , SIGNAL(clicked(bool)), this ,SLOT(onBtnEdit()));
    connect(btnDel , SIGNAL(clicked(bool)) ,this , SLOT(onBtnDel()));
}

void MainWindow::initAddDlg()
{
    m_pAddStuDlg = new AddStuDlg;
    connect(m_pAddStuDlg , SIGNAL(signalStuInfo(QVariantMap)) , this ,SLOT(ExecAddSql(QVariantMap)));
    connect(m_pAddStuDlg , SIGNAL(signalStuInfo(QVariantMap)) , this ,SLOT(ExecEditSql(QVariantMap)));   
}

 StuManager.cpp 

#include "StuManager.h"
#include "ui_StuManager.h"
#include <QTableWidgetItem>
#include <QHeaderView>

StuManager::StuManager(QWidget *parent) : QWidget(parent), ui(new Ui::StuManager)
{
    ui->setupUi(this);
    ui->tableWidget->setColumnCount(7);
    ui->tableWidget->setRowCount(0);
    ui->tableWidget->setHorizontalHeaderLabels(QStringList() <<"姓名" << "学号"<< "性别"
                                               <<"年龄" <<"家庭住址" <<"联系电话" <<"描述");

    ui->tableWidget->setAlternatingRowColors(true);
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}

StuManager::~StuManager()
{
    delete ui;
}

void StuManager::appendRowData(QStringList rowData)    //按行增加数据
{
    int row = ui->tableWidget->rowCount();

    ui->tableWidget->insertRow(row);

    for(int i  = 0 ; i < rowData.size() ; i++)
    {
        QTableWidgetItem *item = new QTableWidgetItem;
        item->setText(rowData.at(i));
        ui->tableWidget->setItem(row , i , item);
    }
}

void StuManager::clearTableData()        //调用removeRow(r)函数清除显示表格中的数据
{
    //清除表格
    int rowCount = ui->tableWidget->rowCount();
    for(int r = rowCount-1 ; r >=0 ; r--)
    {
        ui->tableWidget->removeRow(r);
    }
}

QStringList StuManager::getCurrentRowData()    //提取表格中的数据到容器rowdata()
{
    QStringList rowData;
    int row = ui->tableWidget->currentRow();
    if(row != -1)
    {
        rowData << ui->tableWidget->item(row , 0)->text();
        rowData << ui->tableWidget->item(row , 1)->text();
        rowData << ui->tableWidget->item(row , 2)->text();
        rowData << ui->tableWidget->item(row , 3)->text();
        rowData << ui->tableWidget->item(row , 4)->text();
        rowData << ui->tableWidget->item(row , 5)->text();
        rowData << ui->tableWidget->item(row , 6)->text();
    }
    return rowData;
}

QString StuManager::getCurrentID()            //   标识第2列学号 作为键值 key
{
    QString ID ;
    int row = ui->tableWidget->currentRow();
    if(row != -1)
    {
        ID =  ui->tableWidget->item(row , 1)->text();
    }
    return ID;
}

TeacherManager.cpp 

#include "TeacherManager.h"
#include "ui_teachermanager.h"

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

TeacherManager::~TeacherManager()
{
    delete ui;
}

addstudlg.cpp 

#include "addstudlg.h"
#include "ui_addstudlg.h"
#include <QDateTime>
#include <QStringList>
#include <QString>
#include <QDebug>

AddStuDlg::AddStuDlg(QWidget *parent) :QDialog(parent),ui(new Ui::AddStuDlg)
{
    ui->setupUi(this);
    setFixedSize(sizeHint());
//    setAttribute(Qt::WA_DeleteOnClose);
}

AddStuDlg::~AddStuDlg()           //点击添加、修改弹出对话框
{
    delete ui;
}

void AddStuDlg::setEditData(QStringList rowData)     //往对话框里输入内容
{
    ui->NameEdit->setText(rowData.at(0));
    ui->IDEdit->setText(rowData.at(1));
    ui->AgeSpinBox->setValue(rowData.at(3).toInt());
    ui->SexComboBox->setCurrentText(rowData.at(2));
    ui->AddressEdit->setText(rowData.at(4));
    ui->PhoneEdit->setText(rowData.at(5));
    ui->DescText->setText(rowData.at(6));

    ui->IDEdit->setEnabled(false);
}

void AddStuDlg::clearData()        //关闭对话框时 清理输入进去的数据
{
    ui->NameEdit->clear();
    ui->IDEdit->clear();
    ui->AgeSpinBox->cleanText();
    ui->AddressEdit->clear();
    ui->PhoneEdit->clear();
    ui->DescText->clear();
}

void AddStuDlg::closeEvent(QCloseEvent *event)
{
    clearData();
}

void AddStuDlg::on_buttonBox_accepted()    //对话框的确定键
{
    QVariantMap stuInfo;

    QString name = ui->NameEdit->text();
    QString number = ui->IDEdit->text();
    QString age = ui->AgeSpinBox->text();
    QString sex = ui->SexComboBox->currentText();
    QString address = ui->AddressEdit->text();
    QString phone = ui->PhoneEdit->text();
    QString desc = ui->DescText->toPlainText();

    QString datetime = QDateTime::currentDateTime().toString();

    stuInfo.insert("datetime" ,datetime );
    stuInfo.insert("name" ,name );
    stuInfo.insert("number" ,number );
    stuInfo.insert("age" ,age );
    stuInfo.insert("sex" ,sex );
    stuInfo.insert("address" ,address );
    stuInfo.insert("phone" ,phone );
    stuInfo.insert("desc" ,desc );

    emit signalStuInfo(stuInfo);
    ui->IDEdit->setEnabled(true);
}

void AddStuDlg::on_buttonBox_rejected()     //对话框的取消键
{
    ui->IDEdit->setEnabled(true);
    close();
}

createdb.cpp 

#include "createdb.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>

CreateDb::CreateDb()          //建立与数据库的连接
{

}

void CreateDb::initDB()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("HostName.db");
    db.setDatabaseName("DatabaseName");
    bool ok = db.open();
    if(ok)
    {
        qDebug()<<"Create DB";

        QSqlQuery query;
        query.exec("create table StuManager (create_date datetime, "
                   "id varchar(20)  primary key, name varchar(20) ,"
                   " sex varchar(20) ,age INTEGER ,"
                   "address varchar(20) , phone varchar(12) , description varchar(50))");
    }
    else
    {
        qDebug()<<db.databaseName();
    }
}

QList<QStringList> CreateDb::selectDataFromBase()    //查询数据到容器stuInfo
{
    QSqlQuery query("SELECT * FROM StuManager");

    QList<QStringList> stuInfo;

    while (query.next())
    {
        QStringList rowData ;

        rowData <<query.value(2).toString();
        rowData <<query.value(1).toString();
        rowData <<query.value(3).toString();
        rowData <<query.value(4).toString();
        rowData <<query.value(5).toString();
        rowData <<query.value(6).toString();
        rowData <<query.value(7).toString();
        rowData <<query.value(8).toString();

        stuInfo.append(rowData);
    }
    return stuInfo;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢比扬卡实习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值