Qt5开发学习总结(五)——Qt5 使用 MySQL 数据库及简单应用

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kilotwo/article/details/79248657

安装 MySQL 数据库

1.首先,从官网下载 MySQL 安装包

官方下载

2.安装过程可以参考这篇

MySQL 5.7 版本的安装及简单使用(图文教程)

3.可能会遇到的问题

Qt连接MySQL的时候提示“QSqlDatabase: QMYSQL driver not loaded”,

原因一:缺少文件

解决办法

X:\MySQL\lib中将 libmysql.dll 文件复制X:\Qt\Qt5.6.1\5.6\mingw49_32\bin中。运行程序

原因二:Qt Creator与MySQL位数不统一

如果上面的方法试过了还是不行那么应该是你安装的MySQL和QT的位数不同,可以打开MySQL控制台
输入show variables like '%version_%';即可查看MySql位数。

解决办法:

https://dev.mysql.com/downloads/connector/c/ 下载mysql-connector-c,在其lib目录中找到文件“libmysql.dll”。然后将这个文件复制到Qt的bin目录下,重启Qt Creator后重新打开工程就可以正确运行了。 总之,必须保证你拿到libmysql.dll这个文件对应的mysql的位数必须与QT的位数相同。

数据库基本操作与应用

( 1) 新建 Qt Widgets 应用, 项目名称为 sqlModel, 类名为 MainWindow, 基类选择QMainWindow。

( 2) 完成后在 sqlModel.pro文件中添加如下代码:

QT += sql

( 3) 往项目中添加新的 C++头文件, 名称为“ connection.h”, 完成后在其中添加数据库连接函数的定义:

#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("mydata");       //这里输入你的数据库名
db.setUserName("root");
db.setPassword("");   //这里输入你的密码
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

( 4) 打开 main.cpp 文件, 修改内容如下,顺便修改下风格:

#include "mainwindow.h"
#include <QApplication>
#include "connection.h"
#include <QProcess>
#include<QStyleFactory>                           //修改风格1步
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
     a.setStyle(QStyleFactory::create("fusion"));   //修改风格2步
    // 这里使用代码来运行 MySQL 数据库
    QProcess process;
    process.start("C:/Program Files/MySQL/MySQLServer/bin/mysqld.exe");
    if (!createConnection()) return 1;
    MainWindow w;
    w.show();
    return a.exec();
}

(5) 设计界面mainwindow.ui, 向界面上拖入 Label、 Push Button、 Line Edit和 Table View 等部件,最终效果如图所示。

这里写图片描述

( 6) 打开mainwindow.h文件, 添加类的前置声明:


class QSqlTableModel;

然后再定义一个私有对象:

private:
QSqlTableModel *model;

( 7) mainwindow.cpp文件中, 添加头文件包含:

#include <QSqlQuery>
#include <QSqlTableModel>
#include <QSqlError>
#include <QMessageBox>
在构造函数中添加如下代码:
model = new QSqlTableModel(this);
model->setTable("course");
model->select();
// 设置编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->tableView->setModel(model);

( 8) 下面到设计模式,分别右击各个按钮, 选择“ 转到槽”, 然后选择 clicked()信号。 更改各个槽函数的内容如下:

  • 提交修改按钮
void MainWindow::on_pushButton_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_pushButton_2_clicked()
{
model->revertAll();
} 
  • 查询按钮, 进行筛选
void MainWindow::on_pushButton_7_clicked()
{

    QString name = ui->lineEdit->text();
    if(name.length()){
    //根据姓名进行筛选, 一定要使用单引号
    model->setFilter(QString("teacher = '%1'").arg(name));
    model->select();
    }else
    { QMessageBox::warning(this, tr("Warning"),tr("姓名不能为空") );
    }

}
  • 显示全表按钮
void MainWindow::on_pushButton_8_clicked()
{
model->setTable("course");
model->select();
}
  • 按 id 升序排列按钮
void MainWindow::on_pushButton_5_clicked()
{
//id 属性, 即第 0 列, 升序排列
model->setSort(0, Qt::AscendingOrder);
model->select();
} 
  • 按 id 降序排列按钮
void MainWindow::on_pushButton_6_clicked()
{
model->setSort(0, Qt::DescendingOrder);
model->select();
} 
  • 删除选中行按钮
void MainWindow::on_pushButton_4_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_pushButton_3_clicked()
{
// 获得表的行数
int rowNum = model->rowCount();
// 添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum,0),rowNum+1);
}

程序效果

添加记录

前面的星号表示该数据还没有写入到数据库, 这里 id 默认为已有的最大 id 值加 1

这里写图片描述

这里写图片描述

撤销修改

如果将“ 张老师” 修改为“ 李老师” 并按下回车键, 虽然这里已经修改了, 但是并没有实际写入到数据库, 单击“ 撤销修改” 按钮, 可以改回了“张老师”。

删除选中行

可以删除该行。
这里写图片描述

查询

在“姓名” 中输入“王老师”, 然后单击“ 查询” 按钮, 就可以显示“ 王老师” 一行, 效果如图
这里写图片描述

排序

单击“按 id 降序排列” 按钮, 可以按照 id 从大到小排列各行, 效果如图所示。
这里写图片描述
部分学习自《Qt Creator快速入门》及实验讲义

展开阅读全文

没有更多推荐了,返回首页