在Qt中编写程序,实现数据的增加,删除,查询,修改,排序选择

今天Qt课我学会了编写一个程序,完成数据库操作,要求能够实现数据的增加,删除,查询,修改,排序选择。实现效果大体如下:
在这里插入图片描述
以下是实现步骤:
第一步:新建工程,项目名称为Database_first,类名为Widget,基类为QWidget。
在这里插入图片描述
第二步:在工程文件中添加一句代码:QT += sql即可调用QtSql模块,Datebase_first.pro代码如下:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Database_first
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h
QT += sql

FORMS    += widget.ui

第三步:然后,选中工程,右键选择“添加新文件”,选择C++ Header File ,命名为database.h
在这里插入图片描述
添加如下代码:

#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database.db");
if(!db.open()) return false;
   QSqlQuery query;
query.exec(QObject::tr("create table student (id int primary key, name vchar)"));
    query.exec(QObject::tr("insert into student values (0,'刘明')"));
    query.exec(QObject::tr("insert into student values (1,'陈刚')"));
    query.exec(QObject::tr("insert into student values (2,'王红')"));
    return true;
}
#endif // DATABASE_H

第四步:将main.cpp中添加如下代码:

#include <QtWidgets/QApplication> 
#include "widget.h"
#include "database.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!createConnection())
        return 1;
    Widget w;
    w.show();
    return a.exec();
}

第五步:打开widget.ui,设计界面如下,其中的部件有Table View 和 Line Edit,Label,其余是几个按钮部件,按钮部件的拖放顺序已经标出(可以重新设置按钮部件的objectName属性,防止后面设置这几个按钮部件所对应的槽函数发生混淆,这里我图省劲,没有修改objectName属性)
在这里插入图片描述
第六步:设置widget.h和widget.cpp代码,设置widget.h的代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlTableModel>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QSqlTableModel *model;

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QSqlQueryModel>
#include <QTableView>
#include <QMessageBox>
#include <QSqlError>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    model = new QSqlTableModel(this);
    model->setTable("student");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select(); //选取整个表的所有行
    // model->removeColumn(1); //不显示name属性列,如果这时添加记录,则该属性的值添加不上
    ui->tableView->setModel(model);
    //ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //使其不可编辑
}

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

此时运行程序,效果如下:
在这里插入图片描述

第七步:为每个按钮设置槽函数,打开widget.ui,选中按钮,右键选择“转到槽”,依次为每个按钮添加槽函数代码。
在这里插入图片描述
向widget.cpp添加各个槽函数代码如下:

//插入
void Widget::on_pushButton_clicked()
{
    int rowNum = model->rowCount(); //获得表的行数
       int id = 10;
        model->insertRow(rowNum); //添加一行
        model->setData(model->index(rowNum,0),id);
        //model->submitAll(); //可以直接提交

}
//提交修改
void Widget::on_pushButton_2_clicked()
{
    model->database().transaction(); //开始事务操作
    if (model->submitAll()) {
        model->database().commit(); //提交
    } else {
        model->database().rollback(); //回滚
        QMessageBox::warning(this, tr("tableModel"),
                             tr("数据库错误: %1")
                             .arg(model->lastError().text()));
    }
}
//撤销修改
void Widget::on_pushButton_3_clicked()
{
    model->revertAll();
}
//id升序排列
void Widget::on_pushButton_4_clicked()
{
    model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列
       model->select();
}
//id降序排列
void Widget::on_pushButton_5_clicked()
{
    model->setSort(0,Qt::DescendingOrder);
        model->select();
}
//删除选中行
void Widget::on_pushButton_6_clicked()
{
    int curRow = ui->tableView->currentIndex().row();
        //获取选中的行
        model->removeRow(curRow);
        //删除该行
        int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定"
     "删除当前行吗?"),QMessageBox::Yes,QMessageBox::No);
        if(ok == QMessageBox::No)
        {
           model->revertAll(); //如果不删除,则撤销
        }
        else model->submitAll(); //否则提交,在数据库中删除该行

}
//查询
void Widget::on_pushButton_7_clicked()
{
    QString name = ui->lineEdit->text();
      model->setFilter(QObject::tr("name = '%1'").arg(name)); //根据姓名进行筛选
      model->select(); //显示结果
}
//返回全表
void Widget::on_pushButton_8_clicked()
{
    model->setTable("student");   //重新关联表
        model->select();   //这样才能再次显示整个表的内容
}

至此,这个程序完成。
工程各个文件总代码如下:
Datebase_first.pro代码如下:

#-------------------------------------------------
#
# Project created by QtCreator 2019-10-10T20:09:35
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Database_first
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h
QT += sql			//在生成的文件中只加了这一句代码

FORMS    += widget.ui

database.h代码如下:

#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database.db");
if(!db.open()) return false;
   QSqlQuery query;
query.exec(QObject::tr("create table student (id int primary key, name vchar)"));
    query.exec(QObject::tr("insert into student values (0,'刘明')"));
    query.exec(QObject::tr("insert into student values (1,'陈刚')"));
    query.exec(QObject::tr("insert into student values (2,'王红')"));
    return true;
}
#endif // DATABASE_H

widget.h代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlTableModel>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QSqlTableModel *model;

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_8_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp代码如下:

#include <QtWidgets/QApplication>
#include "widget.h"
#include "database.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!createConnection())
        return 1;
    Widget w;
    w.show();
    return a.exec();
}

widget.cpp代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QSqlQueryModel>
#include <QTableView>
#include <QMessageBox>
#include <QSqlError>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    model = new QSqlTableModel(this);
    model->setTable("student");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select(); //选取整个表的所有行
    // model->removeColumn(1); //不显示name属性列,如果这时添加记录,则该属性的值添加不上
    ui->tableView->setModel(model);
    //ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //使其不可编辑
}

Widget::~Widget()
{
    delete ui;
}
//插入
void Widget::on_pushButton_clicked()
{
    int rowNum = model->rowCount(); //获得表的行数
       int id = 10;
        model->insertRow(rowNum); //添加一行
        model->setData(model->index(rowNum,0),id);
        //model->submitAll(); //可以直接提交

}
//提交修改
void Widget::on_pushButton_2_clicked()
{
    model->database().transaction(); //开始事务操作
    if (model->submitAll()) {
        model->database().commit(); //提交
    } else {
        model->database().rollback(); //回滚
        QMessageBox::warning(this, tr("tableModel"),
                             tr("数据库错误: %1")
                             .arg(model->lastError().text()));
    }
}
//撤销修改
void Widget::on_pushButton_3_clicked()
{
    model->revertAll();
}
//id升序排列
void Widget::on_pushButton_4_clicked()
{
    model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列
       model->select();
}
//id降序排列
void Widget::on_pushButton_5_clicked()
{
    model->setSort(0,Qt::DescendingOrder);
        model->select();
}
//删除选中行
void Widget::on_pushButton_6_clicked()
{
    int curRow = ui->tableView->currentIndex().row();
        //获取选中的行
        model->removeRow(curRow);
        //删除该行
        int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定"
     "删除当前行吗?"),QMessageBox::Yes,QMessageBox::No);
        if(ok == QMessageBox::No)
        {
           model->revertAll(); //如果不删除,则撤销
        }
        else model->submitAll(); //否则提交,在数据库中删除该行

}
//查询
void Widget::on_pushButton_7_clicked()
{
    QString name = ui->lineEdit->text();
      model->setFilter(QObject::tr("name = '%1'").arg(name)); //根据姓名进行筛选
      model->select(); //显示结果
}
//返回全表
void Widget::on_pushButton_8_clicked()
{
    model->setTable("student");   //重新关联表
        model->select();   //这样才能再次显示整个表的内容
}

Widget.ui设计如下,标号的是按钮部件:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 4 · 访问量 4654

猜你喜欢

转载自blog.csdn.net/qq_42884482/article/details/102490937