实现结果:
这个小的程序实现主要分为两个三个部分:
- 添加一个connection.h文件,实现数据库的连接
- 在ui界面拖入相应的控件,构件图形化界面
- 在mainwindow.cpp中现实相应的代码操作(需要注意函数都是按键的槽的clicked()函数)
在实现项目前,首先需要在.pro中添加:
QT += sql
一,connection.h代码实现
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("127.0.0.1");
db.setPort(3333);
db.setDatabaseName("mydata");
db.setUserName("root");
db.setPassword("root");
if (!db.open())
{
QMessageBox::critical(0, QObject::tr("无法打开数据库"),
"无法创建数据库连接!", QMessageBox::Cancel);
return false;
}
// 下面来创建表
// 如果 MySQL 数据库中已经存在同名的表,那么下面的代码不会执行
QSqlQuery query(db);
// 使数据库支持中文
query.exec("SET NAMES 'Latin1'");
// 创建 course 表
query.exec("create table course (id int primary key, "
"name varchar(20), teacher varchar(20))");
query.exec("insert into course values(0, '数学', '张老师')");
query.exec("insert into course values(1, '语文', '李老师')");
query.exec("insert into course values(2, '英语', '王老师')");
return true;
}
#endif
// CONNECTION_H
二,mainwindow.h代码实现
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class QSqlTableModel;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_on_pushButton_clicked_clicked();
void on_on_pushButton_2_clicked_clicked();
void on_on_pushButton_7_clicked_clicked();
void on_on_pushButton_8_clicked_clicked();
void on_on_pushButton_5_clicked_clicked();
void on_on_pushButton_4_clicked_clicked();
void on_on_pushButton_3_clicked_clicked();
void on_on_pushButton_6_clicked_clicked();
private:
Ui::MainWindow *ui;
QSqlTableModel *model;
};
#endif // MAINWINDOW_H
三,main.cpp代码实现
#include "mainwindow.h"
#include <QApplication>
#include "connection.h"
#include <QProcess>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QProcess process;
process.start("D:/mysql/mydwl/bin/mysqld.exe");
if (!createConnection())
return 1;
MainWindow w;
w.show();
return a.exec();
}
四,mainwindow.cpp代码实现
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQuery>
#include <QSqlTableModel>
#include <QSqlError>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model = new QSqlTableModel(this);
model->setTable("course");
model->select(); // 设置编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->tableView->setModel(model);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 提交修改按钮
void MainWindow::on_on_pushButton_clicked_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 MainWindow::on_on_pushButton_2_clicked_clicked()
{
model->revertAll();
}
// 查询按钮,进行筛选
void MainWindow::on_on_pushButton_7_clicked_clicked()
{
QString name = ui->lineEdit->text(); //根据姓名进行筛选,一定要使用单引号
model->setFilter(QString("teacher = '%1'").arg(name));
model->select();
}
// 显示全表按钮
void MainWindow::on_on_pushButton_8_clicked_clicked()
{
model->setTable("course");
model->select();
}
// 按 id 降序排列按钮
void MainWindow::on_on_pushButton_6_clicked_clicked()
{
model->setSort(0, Qt::DescendingOrder);
model->select();
}
// 按 id 升序排列按钮
void MainWindow::on_on_pushButton_5_clicked_clicked()
{
//id 属性,即第 0 列,升序排列
model->setSort(0, Qt::AscendingOrder); model->select();
}
// 删除选中行按钮
void MainWindow::on_on_pushButton_4_clicked_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 MainWindow::on_on_pushButton_3_clicked_clicked()
{
// 获得表的行数
int rowNum = model->rowCount();
// 添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum,0),rowNum);
}