QT6对数据库增删改查操作还是比较简单的,只要会数据库操作的都没问题。

本项目中对数据库操作,主要有四步

  1. 在.pro文件中增加对数据库的支持
  2. 配置数据库
  3. 新建学生成绩表
  4. 进行增删改查操作

1、在.pro文件中增加对数据库的支持

使用数据库就需要在项目文件.pro中加上这句话 QT += sql

QT       += core gui
QT       += sql

2、配置数据库

void MainWindow::openDataBase(){
    // QMYSQLDriver
    db=QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");    //数据库服务器
    db.setPort(3306);
    db.setUserName("root");        //数据库用户名
    db.setPassword("root");        //数据库密码
    db.setDatabaseName("test");    //数据库名
    if(db.open()==true)
        qDebug() <<"数据库打开成功";
    else
        qDebug() <<"数据库打开失败";
}

3、新建学生成绩表

注意:程序中使用的是UTF-8格式

void MainWindow::createTable(){
    QSqlQuery query;
    QString str=QString("create table student( id int primary key not null, name varchar(12),score float(4,1))  DEFAULT CHARSET utf8 COLLATE utf8_general_ci");
    if(!query.exec(str))
        qDebug()<< " error: "<<query.lastError();
    else qDebug()<< "创建表成功!"<<str;
}

4、进行增删改查操作

  • 删除操作在on_delButton_clicked()方法中
  • 新增、修改操作在on_saveButton_clicked()方法中
  • 查询操作在queryTable()方法中
  • 因为都是在一个窗口中的操作,所以源码就两个文件。

ui_mainwindow.h,全部代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlError>
#include <QDebug>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    void openDataBase();
    void createTable();
    void queryTable();
    void setStatus(int);
private slots:
    void on_updateButton_clicked();

    void on_insertButton_clicked();

    void on_delButton_clicked();

    void on_tableView_clicked(const QModelIndex &index);

    void on_cancelButton_clicked();

    void on_saveButton_clicked();

private:
    Ui::MainWindow *ui;
    QSqlDatabase db; //数据库
    QSqlQueryModel *model;
    int editType=0;//0:初始态/1:新增/2:编辑
};
#endif // MAINWINDOW_H

ui_mainwindow.cpp,全部代码

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model =new  QSqlQueryModel(this);
    openDataBase();
    createTable();
    queryTable();
    //选择整行
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    //不可编辑
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //行头居中
    ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignHCenter);
    setStatus(0);

}

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


void MainWindow::on_updateButton_clicked()
{
    setStatus(2);

}


void MainWindow::on_insertButton_clicked()
{
    setStatus(1);
}


void MainWindow::on_delButton_clicked()
{
    QSqlQuery query;
    query.prepare("delete from student where id = :id");
    query.bindValue(":id", ui->idEdit->text().toInt());
    if(QMessageBox::question(this,"删除","确定要删除该数据吗?",QMessageBox::Yes|QMessageBox::No) == QMessageBox::No)
        return;

    if(!query.exec()){
        QMessageBox::critical(this,"提示","删除失败!"+query.lastError().text());
        return;
    }
    queryTable();
    QMessageBox::critical(this,"提示","删除成功!");
}


void MainWindow::openDataBase(){
    // QMYSQLDriver
    db=QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");    //数据库服务器
    db.setPort(3306);
    db.setUserName("root");        //数据库用户名
    db.setPassword("root");        //数据库密码
    db.setDatabaseName("test");    //数据库名
    if(db.open()==true)
        qDebug() <<"数据库打开成功";
    else
        qDebug() <<"数据库打开失败";
}
void MainWindow::createTable(){
    QSqlQuery query;
    QString str=QString("create table student( id int primary key not null, name varchar(12),score float(4,1))  DEFAULT CHARSET utf8 COLLATE utf8_general_ci");
    if(!query.exec(str))
        qDebug()<< " error: "<<query.lastError();
    else qDebug()<< "创建表成功!"<<str;

}

void MainWindow::queryTable(){
    editType=0;
    model->setQuery("select * from student");
    ui->tableView->setModel(model);
    model->setHeaderData(0, Qt::Horizontal, tr("学号"));
    model->setHeaderData(1, Qt::Horizontal, tr("姓名"));
    model->setHeaderData(2, Qt::Horizontal, tr("成绩"));


}


void MainWindow::on_tableView_clicked(const QModelIndex &index)
{
    //获取行号
    int row =index.row();
    //也可以这样
    //int row = ui-> tableView ->currentIndex().row();

    ui->idEdit->setText(ui->tableView->model()->index(row,0).data().toString());
    ui->nameEdit->setText(ui->tableView->model()->index(row,1).data().toString());
    ui->scoreEdit->setText(ui->tableView->model()->index(row,2).data().toString());
//或者这样
//    ui->idEdit->setText(model->data(model->index(row, 0)).toString());
//    ui->nameEdit->setText(model->data(model->index(row, 1)).toString());
//    ui->scoreEdit->setText(model->data(model->index(row, 2)).toString());
}
void MainWindow::setStatus(int status){
    editType=status;
    if(status==1){
        ui->idEdit->setText("");
        ui->nameEdit->setText("");
        ui->scoreEdit->setText("");
        ui->idEdit->setEnabled(true);
        ui->nameEdit->setEnabled(true);
        ui->scoreEdit->setEnabled(true);
        ui->cancelButton->setEnabled(true);
        ui->saveButton->setEnabled(true);
        ui->insertButton->setEnabled(false);
        ui->updateButton->setEnabled(false);
        ui->delButton->setEnabled(false);
        ui->idEdit->setFocus();
        return;
    }
    if(status==2){
        ui->idEdit->setEnabled(false);
        ui->nameEdit->setEnabled(true);
        ui->scoreEdit->setEnabled(true);
        ui->cancelButton->setEnabled(true);
        ui->saveButton->setEnabled(true);
        ui->insertButton->setEnabled(false);
        ui->updateButton->setEnabled(false);
        ui->delButton->setEnabled(false);
        ui->idEdit->setFocus();
        return;
    }
    ui->idEdit->setText("");
    ui->nameEdit->setText("");
    ui->scoreEdit->setText("");
    ui->idEdit->setEnabled(false);
    ui->nameEdit->setEnabled(false);
    ui->scoreEdit->setEnabled(false);
    ui->cancelButton->setEnabled(false);
    ui->saveButton->setEnabled(false);
    ui->insertButton->setEnabled(true);
    ui->updateButton->setEnabled(true);
    ui->delButton->setEnabled(true);
}

void MainWindow::on_cancelButton_clicked()
{
    setStatus(0);
}

void MainWindow::on_saveButton_clicked()
{
    if(ui->idEdit->text() == ""||!ui->idEdit->text().toInt()){
          QMessageBox::critical(this,"提示","id不能为空且必须为数字!");
          return;
    }
    if(ui->nameEdit->text() == ""){
          QMessageBox::critical(this,"提示","姓名不能为空!");
          return;
    }
    if(ui->scoreEdit->text() == ""||!ui->scoreEdit->text().toFloat()){
          QMessageBox::critical(this,"提示","成绩不能为空且必须为数字!");
          return;
    }
    int id = ui->idEdit->text().toInt();
    QString name = ui->nameEdit->text();
    float score = ui->scoreEdit->text().toFloat();

    QSqlQuery query;
    if(editType==1){
        QSqlQuery query;
        query.prepare("insert into student(id,name,score) values(:id,:name,:score)");
        query.bindValue(":id", id);
        query.bindValue(":name", name);
        query.bindValue(":score", score);
        if(!query.exec()){
            QMessageBox::critical(this,"提示","新增失败!"+query.lastError().text());
            return;
        }
    }
    if(editType==2){
        query.prepare("update student set name = :name, score = :score where id =:id");
        query.bindValue(":id", id);
        query.bindValue(":name", name);
        query.bindValue(":score", score);
        if(!query.exec()){
            QMessageBox::critical(this,"提示","修改失败!"+query.lastError().text());
            return;
        }
    }
    QMessageBox::critical(this,"提示","保存成功!");
    setStatus(0);
    queryTable();
}

最终效果

请添加图片描述请添加图片描述
请添加图片描述

以上仅供参考,如有疑问,欢迎探讨。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐