C++ Qt数据库简单使用
2020 年 06 月 01 日 272 796 字 暂无评论

1.数据库连接

1.1需要添加的支持

  • Qt中使用数据库需要在.pro中增加
QT       +=  sql
  • Qt中支持数据库驱动为
//打印Qt支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();
  • [ ] ("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
  • [ ] 常用的为MYSQL,这里我也是使用的MYSQL。
  • 这里需要注意需要把MYSQL下的

    • X:\MySQL\lib 中将 libmysql.dll 文件复制X:\Qt\Qt5.10.1\mingw53_32\bin
    • 且注意位数相同,指和Qt位数相同,如我的是32位的Qt,64位的数据库,但需要把32位数据库的libmysql.dll复制过去。
  • 需要包含的头文件
#include <QSqlDatabase> //建立数据库 
#include <QDebug>       //打印
#include <QMessageBox>  //错误时消息对话框
#include <QSqlError>    //数据库错误
#include <QSqlQuery>    //数据库表
#include <QVariantList> //数据列表字段

1.2建立连接

  • 建立连接需要数据设置库驱动,数据库服务器IP或名字,数据库用户名,数据库密码,使用哪个数据库。
//添加MySql数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    //连接数据库
    db.setHostName("127.0.0.1");   //数据库服务器IP或名字
    db.setUserName("root");  //数据库用户名
    db.setPassword("123456");//密码
    db.setDatabaseName("info"); //使用哪个数据库
//打开数据库
    if(db.open() == false)
    {
        QMessageBox::warning(this,"错误",db.lastError().text());
        return;
    }

1.3对数据库进行操作

  • 然后就可以创建表和对表进行增删查改了,具体可以使用数据库语句。
//创建表
//表名student,表头id,name,age,score
    QSqlQuery query;
    query.exec("create table student(id int primary key auto_increment,"
               "name varchar(255),age int,score int);");

    //插入
    query.exec("insert into student(id,name,age,score) values(1,'zfh',18,100)");
  • 批量插入
  • odbc风格(必须按顺序插入)
    // ? 相当于 占位符
    query.prepare("insert into student(name,age,score) values(?,?,?)");

    //给字段设置内容 list
    QVariantList nameList;
    nameList << "xiaoming" << "xiaohong" << "xiaojiang";
    QVariantList ageList;
    ageList << 11 << 22 << 33;
    QVariantList scoreList;
    scoreList << 59 << 69 << 79;
    //给字段绑定相应的值 按顺序绑定
    query.addBindValue(nameList);
   query.addBindValue(ageList);
    query.addBindValue(scoreList);
   //执行预处理命令
   query.execBatch();
  • oracle风格
//oracle风格
    query.prepare("insert into student(name,age,score) values(:name,:age,:score)");
    //给字段设置内容 list
    QVariantList nameList;
    nameList << "xiaoming1" << "xiaohong1" << "xiaojiang1";
    QVariantList ageList;
    ageList << 111 << 222 << 333;
    QVariantList scoreList;
    scoreList << 599 << 699 << 799;
    //给字段绑定
    query.bindValue(":name",nameList);
    query.bindValue(":score",scoreList);
    query.bindValue(":age",ageList);
    //执行预处理命令
    query.execBatch();

因为增加了字典一样的索引,所以可以指定插入,不按表格顺序。

  • 数据库查找遍历
query.exec("select * from student");

    while(query.next()) //一行一行遍历
    {
        //取出当前行的内容
        qDebug() << query.value(0).toInt()
                 << query.value(1).toString()
                 << query.value("age").toInt()
                 << query.value("score").toInt();
  • 通过按键查找某条内容并删除
void Widget::on_btn_del_clicked()
{
    //获取行编辑内容
    QString name = ui->lineEdit->text();

    QString str = QString("delete from student where name = '%1'").arg(name);

    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;
    query.exec(str);
}

void Widget::on_btndelsure_clicked()
{
    //确定删除
    QSqlDatabase::database().commit();
}

void Widget::on_btn_cel_clicked()
{
    //回滚,撤销
    QSqlDatabase::database().rollback();
}

数据库在删除时有个确认事件发生和撤销的功能。

2.Qt中一种简单的数据库可视化处理

2.1简单介绍

  • 主要用到了model和控件中的Table View。
  • 相当于把数据库模型指定一个数据库表,再放入Table View中这样就可以可视化操作数据库了。
  • 实际操作很简单,直接上个例子更好懂

2.2可视化数据库UI设计

  • 一个Table View,一个LineEdit 和几个按键

2.3代码实现

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();

private slots:
    void on_btn_add_clicked();

    void on_btn_sure_clicked();

    void on_btn_cel_clicked();

    void on_btn_del_clicked();

    void on_btn_find_clicked();

private:
    Ui::Widget *ui;
    QSqlTableModel *model;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlTableModel> // sqltab模型
#include <QSqlRecord>     //记录

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //打印Qt支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();

    //添加MySql数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    //连接数据库
    db.setHostName("127.0.0.1");   //数据库服务器IP或名字
    db.setUserName("root");  //数据库用户名
    db.setPassword("123456");//密码
    db.setDatabaseName("info"); //使用哪个数据库

    //打开数据库
    if(db.open() == false)
    {
        QMessageBox::warning(this,"错误",db.lastError().text());
        return;
    }

    //设置模型
    model = new QSqlTableModel(this);
    model->setTable("student");//指定使用哪个表

    //把model放在view
    ui->tableView->setModel(model);

    //显示model里的数据
    model->select();

    //修改显示标题,不改数据库内容
    model->setHeaderData(0,Qt::Horizontal,"学号");

    //设置model的编辑模式,手动提交修改
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);

    //设置view中的数据库不允许修改
    //ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

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

void Widget::on_btn_add_clicked()
{
    //添加空记录
    QSqlRecord record = model->record(); //获取空记录
    //获取行号
    int row = model->rowCount();
    model->insertRecord(row,record);
}

void Widget::on_btn_sure_clicked()
{
    model->submitAll(); //提交动作
}

void Widget::on_btn_cel_clicked()
{
    model->revertAll();//取消所有动作
    model->submitAll(); //提交动作
}

void Widget::on_btn_del_clicked()
{
    //获取选中的模型
    QItemSelectionModel *sModel  = ui->tableView->selectionModel();
    //取出模型中的索引
    QModelIndexList list = sModel->selectedRows();
    //删除所有选中的行
    for(int i = 0;i<list.size();i++)
    {
        model->removeRow(list.at(i).row());
    }
}

void Widget::on_btn_find_clicked()
{
    QString name = ui->lineEdit->text();
    QString str = QString("name = '%1'").arg(name);

    model->setFilter(str);
    model->select();
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    #if (QT_VERSION >= QT_VERSION_CHECK(5,9,0))
        QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif  //自适应分辨率

    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

代码简单,打了注释

2.4运行结果

  • 可以通过按键增加删除查找,可以直接在Table View 中修改数据库内容,非常方便。
  • 以上也是我初学Qt数据库的总结,后续如果遇到要使用和提升,我会更新博客。

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/84/



评论已关闭