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

目录

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是用 Qt 创建登录界面并与数据库交互的步骤: 1. 打开 Qt Creator,创建一个新的 Qt Widgets 应用程序项目。 2. 在项目中添加一个登录界面UI 界面,可以使用 Qt Designer 工具进行创建。 3. 在登录界面中添加用户名和密码的输入框以及登录按钮。 4. 在 Qt Creator 中添加数据库连接,选择数据库类型和数据库驱动,输入数据库的连接信息,如数据库名称、用户名和密码等等。 5. 在登录按钮的槽函数中,获取输入框中的用户名和密码信息,然后使用 SQL 语句查询数据库中是否有匹配的用户信息。如果有,弹出提示框登录成功;如果没有,弹出提示框登录失败。 以下是一个简单的示例代码: ```cpp #include <QApplication> #include <QtSql> #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug> #include <QMessageBox> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 连接数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("test.db"); if (!db.open()) { qDebug() << "Failed to connect to database!"; return -1; } // 创建数据表 QSqlQuery query; query.exec("create table user (id int primary key, name varchar(20), password varchar(20))"); query.exec("insert into user values(1, 'admin', '123456')"); // 创建登录界面 QWidget w; w.setWindowTitle("Login"); w.resize(300, 200); QLabel *label1 = new QLabel("Username:", &w); label1->move(50, 50); QLineEdit *lineEdit1 = new QLineEdit(&w); lineEdit1->move(120, 50); QLabel *label2 = new QLabel("Password:", &w); label2->move(50, 100); QLineEdit *lineEdit2 = new QLineEdit(&w); lineEdit2->move(120, 100); lineEdit2->setEchoMode(QLineEdit::Password); QPushButton *button = new QPushButton("Login", &w); button->move(120, 150); // 登录按钮的槽函数 QObject::connect(button, &QPushButton::clicked, [&]() { QString username = lineEdit1->text(); QString password = lineEdit2->text(); QSqlQuery query; query.exec(QString("select * from user where name='%1' and password='%2'").arg(username).arg(password)); if (query.next()) { QMessageBox::information(&w, "Information", "Login success!"); } else { QMessageBox::warning(&w, "Warning", "Login failed!"); } }); w.show(); return a.exec(); } ``` 需要注意的是,这只是一个简单的示例,实际的应用程序中可能需要更复杂的数据库操作和数据验证逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卢比扬卡实习生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值