我是靠谱客的博主 欢喜花卷,最近开发中收集的这篇文章主要介绍Qt深入浅出(十八)MySql的使用MySql的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MySql的使用

1 使用QSqlDataBase

  • Qt数据中的管理类为QSqlDataBase,没有继承任何基类,需要在pro文件中添加QT += sql。

代码如下:


  1. #include <QSqlDatabase>
  2. #include <QDebug>
  3. #include <QCoreApplication>
  4. int main(int argc, char**argv)
  5. {
  6.    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  7.    db.setHostName("127.0.0.1");
  8.    db.setDatabaseName("TESTDB");
  9.    db.setUserName("root");
  10.    db.setPassword("root");
  11.    bool ok = db.open();
  12.    qDebug() << "open db:" << ok << endl;
  13. db.close();
  14.    return 0;
  15. }

​ 这个时候会报错:


  1. QSqlDatabase: mysql driver not loaded
  2. QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

​ 这是因为Qt默认没有安装mysql驱动,需要将libmysql.dll拷贝到Qt的安装路径中,这个libmysql.dll可以到官网http://dev.mysql.com/downloads/connector/c/ 下载,下载32位还是64位的要根据编译工具来判断,例如32位的MinGW就下载32位的mysql驱动。

​ 将libmysql.dll拷贝到如C:QtQt5.7.05.7mingw53_32bin目录下。

  • SQL语句使用使用QSqlQuery


  1. #include <QSqlDatabase>
  2. #include <QDebug>
  3. #include <QSqlQuery>
  4. #include <QSqlError>
  5. int main(int argc, char**argv)
  6. {
  7.    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  8.    db.setHostName("127.0.0.1");
  9.    db.setDatabaseName("TESTDB");
  10.    db.setUserName("root");
  11.    db.setPassword("root");
  12.    if(!db.open())
  13.   {
  14.        qDebug() << db.lastError().text() << endl;
  15.   }
  16.    QSqlQuery sql(db);
  17.    if(!sql.exec("SELECT * FROM test_tb11")) //exec返回true代表执行SQL语句成功
  18.   {
  19.        qDebug() << sql.lastError().text() << endl;
  20.   }
  21.    while(sql.next()) //获取下一条记录,如果没有下一条则返回false。
  22.   {
  23.        qDebug() << sql.value("name").toString() << endl
  24.                  << sql.value("age").toString() << endl
  25.                    << sql.value("sub_date").toString() << endl;
  26.   }
  27.    if(!sql.exec("DELETE FROM test_tb WHERE name = 'Zhangsan'"))
  28.   {
  29.        qDebug() << sql.lastError().text() << endl;
  30.   }
  31.    if(!sql.exec("UPDATE test_tb SET age=99 WHERE name = 'Lisi'"))
  32.   {
  33.        qDebug() << sql.lastError().text() << endl;
  34.   }
  35.    db.close();
  36.    return 0;
  37. }

  • 事务常用函数


  1. bool QSqlDatabase::transaction();
  2. bool QSqlDatabase::commit();
  3. bool QSqlDatabase::rollback();

2 使用QSqlTableModel

​ 使用QSqlTableModel,可以非常智能的来管理数据库,不需要填写sqlquery语句。

2.1 在QTableView上显示

​ QSqlTableModel无法单独显示,它也仅仅是数据模型,但是通过QTableView来显示。

​ Widget.h


  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. class QTableView;
  5. class QSqlTableModel;
  6. class Widget : public QWidget
  7. {
  8.    Q_OBJECT
  9. public:
  10.    Widget(QWidget *parent = 0);
  11.    ~Widget();
  12. private:
  13.    void initMySql();
  14. private:
  15.    QTableView* _view;
  16.    QSqlTableModel* _sqlModel;
  17. };
  18. #endif // WIDGET_H

​ Widget.cpp


  1. #include "widget.h"
  2. #include <QDebug>
  3. #include <QTableView>
  4. #include <QVBoxLayout>
  5. #include <QSqlTableModel>
  6. Widget::Widget(QWidget *parent)
  7.   : QWidget(parent)
  8. {
  9.    QVBoxLayout* vBox = new QVBoxLayout;
  10.    this->setLayout(vBox);
  11.    initMySql();
  12.    _view = new QTableView;
  13.    vBox->addWidget(_view);
  14.    _view->setModel(_sqlModel);
  15. }
  16. void Widget::initMySql()
  17. {
  18. /*连接数据库*/
  19.    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  20.    db.setHostName("127.0.0.1");
  21.    db.setDatabaseName("TESTDB");
  22.    db.setUserName("root");
  23.    db.setPassword("root");
  24.    if(!db.open())
  25.   {
  26.        qDebug() << "db open failed" << endl;
  27.   }
  28. /*创建数据库模型,链接db对象*/
  29.    _sqlModel = new QSqlTableModel(this, db);
  30.    _sqlModel->setTable("test_tb"); //选择TESTDB数据库中的表格test_tb
  31.    _sqlModel->select(); //相当于“SELECT * FROM test_tb;”
  32. }
  33. Widget::~Widget()
  34. {
  35. }

​ 以上例子通过QSqlTableModel将数据库TESTDB.test_tb中的数据全部显示到QTableView上,并且可以通过QTableView来修改内容。

2.2 手动提交

​ 上面的例子我们发现经过QTableView修改的并不能实时更新到数据库中,其实我们可以自己手动提交,通过setEditStrategy设置数据库提交的策略:


  1. [virtual] void QSqlTableModel::setEditStrategy(EditStrategy strategy);
  2. /*
  3. * EditStrategy提交的策略,是个枚举类型,具体请看Qt
  4. */

​ 设置为手动提交后,可以使用submitall来提交:


  1. [slot] bool QSqlTableModel::submitAll();

以下例子通过添加一个按钮来提交,在17.2.1的基础上进行修改widget.cpp


  1. #include "widget.h"
  2. #include <QDebug>
  3. #include <QTableView>
  4. #include <QVBoxLayout>
  5. #include <QSqlTableModel>
  6. #include <QHBoxLayout>
  7. #include <QPushButton>
  8. Widget::Widget(QWidget *parent)
  9.   : QWidget(parent)
  10. {
  11.    QVBoxLayout* vBox = new QVBoxLayout;
  12.    this->setLayout(vBox);
  13.    initMySql();
  14.    _view = new QTableView;
  15.    vBox->addWidget(_view);
  16.    _view->setModel(_sqlModel);
  17.    QHBoxLayout* hBox = new QHBoxLayout;
  18.    vBox->addLayout(hBox);
  19.    QPushButton* pb_sub = new QPushButton("提交");
  20.    hBox->addWidget(pb_sub);
  21.    /*按钮按下触发submitAll*/
  22.    connect(pb_sub, SIGNAL(clicked()),  _sqlModel, SLOT(submitAll()));
  23. }
  24. void Widget::initMySql()
  25. {
  26.    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  27.    db.setHostName("127.0.0.1");
  28.    db.setDatabaseName("TESTDB");
  29.    db.setUserName("root");
  30.    db.setPassword("root");
  31.    if(!db.open())
  32.   {
  33.        qDebug() << "db open failed" << endl;
  34.   }
  35.    _sqlModel = new QSqlTableModel(this, db);
  36.    _sqlModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置为手动提交
  37.    _sqlModel->setTable("test_tb");
  38.    _sqlModel->select();
  39.  // _sqlModel->removeColumn(1); //不显示第二列
  40. }
  41. Widget::~Widget()
  42. {
  43. }

2.3 撤销修改

​ 如果不想提交修改的内容,那么可以撤销操作,revertAll


  1. [slot] void QSqlTableModel::revertAll();

2.4 过滤器

​ 如果只想显示特定的内容,那么可以使用QSqlTableModel的过滤器,相当是SQL中的WHERE子句:


  1. [virtual] void QSqlTableModel::setFilter(const QString &filter);

​ 例如:


  1. _sqlModel->setFilter("age = 2");

2.5 排序

​ 如果想要进排序可以使用QSqlTableModel::setSort,相当于SQL中的ORDER BY:


  1. [virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order)

2.6 添加一条记录

​ 如果想添加一条记录,那么需要知道记录表格式,那么可以通过QSqlTableModel::record来获取, QSqlTableModel::insertRecord来插入数据:


  1. QSqlRecord QSqlTableModel::record() const;
  2. bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record);
  3. /*
  4. * 在row行插入数据,如果row为负数就在末尾插入一行
  5. */

例如


  1. void Widget::addSlot()
  2. {
  3.    QSqlRecord record = _model->record();
  4.    _model->insertRecord(-1, record); //在末尾插入数据
  5. }

2.7 删除记录

​ 删除的时候一般要先获取到当前被选中的行:


  1. void Widget::deleteSlot()
  2. {
  3.    QItemSelectionModel* selectModel = _view->selectionModel();
  4. QModelIndexList list = selectModel->selectedIndexes();
  5. foreach(QModelIndex index, list)
  6. {
  7.   _sqlModel->removeRow(index.row());
  8. }
  9. }

2.8 综合例子

Widget.h


  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. class QTableView;
  5. class QSqlTableModel;
  6. class Widget : public QWidget
  7. {
  8.    Q_OBJECT
  9. public:
  10.    Widget(QWidget *parent = 0);
  11.    ~Widget();
  12. public slots:
  13.    void addSlot();
  14.    void deleteSlot();
  15. private:
  16.    void initMySql();
  17. private:
  18.    QTableView* _view;
  19.    QSqlTableModel* _sqlModel;
  20. };
  21. #endif // WIDGET_H

Widget.cpp


  1. #include "widget.h"
  2. #include <QDebug>
  3. #include <QTableView>
  4. #include <QVBoxLayout>
  5. #include <QSqlTableModel>
  6. #include <QHBoxLayout>
  7. #include <QPushButton>
  8. #include <QSqlRecord>
  9. Widget::Widget(QWidget *parent)
  10.   : QWidget(parent)
  11. {
  12.    QVBoxLayout* vBox = new QVBoxLayout;
  13.    this->setLayout(vBox);
  14.    initMySql();
  15.    _view = new QTableView;
  16.    vBox->addWidget(_view);
  17.    _view->setModel(_sqlModel);
  18.    QHBoxLayout* hBox = new QHBoxLayout;
  19.    vBox->addLayout(hBox);
  20.    QPushButton* pb_sub = new QPushButton("提交");
  21.    QPushButton* pb_revert = new QPushButton("撤销");
  22.    QPushButton* pb_insert = new QPushButton("插入");
  23.    QPushButton* pb_delete = new QPushButton("删除");
  24.    hBox->addWidget(pb_sub);
  25.    hBox->addWidget(pb_revert);
  26.    hBox->addWidget(pb_insert);
  27.    hBox->addWidget(pb_delete);
  28.    /*按钮按下触发submitAll*/
  29.    connect(pb_sub, SIGNAL(clicked()),  _sqlModel, SLOT(submitAll()));
  30.    connect(pb_revert, SIGNAL(clicked()), _sqlModel, SLOT(revertAll()));
  31.    connect(pb_insert, SIGNAL(clicked()), this, SLOT(addSlot()));
  32.    connect(pb_delete, SIGNAL(clicked()), this, SLOT(deleteSlot()));
  33. }
  34. void Widget::initMySql()
  35. {
  36.    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  37.    db.setHostName("127.0.0.1");
  38.    db.setDatabaseName("TESTDB");
  39.    db.setUserName("root");
  40.    db.setPassword("root");
  41.    if(!db.open())
  42.   {
  43.        qDebug() << "db open failed" << endl;
  44.   }
  45.    _sqlModel = new QSqlTableModel(this, db);
  46.    _sqlModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置为手动提交
  47.    _sqlModel->setTable("test_tb");
  48.    _sqlModel->setFilter("age > 0");
  49.    _sqlModel->setSort(1, Qt::AscendingOrder);
  50.    _sqlModel->select();
  51.  // _sqlModel->removeColumn(1); //不显示第二列
  52. }
  53. void Widget::addSlot()
  54. {
  55.    QSqlRecord record = _sqlModel->record();
  56.    _sqlModel->insertRecord(-1, record); //在末尾插入数据
  57. }
  58. void Widget::deleteSlot()
  59. {
  60.    QItemSelectionModel* selectModel = _view->selectionModel();
  61.    QModelIndexList list = selectModel->selectedIndexes();
  62.    foreach(QModelIndex index, list)
  63.   {
  64.        _sqlModel->removeRow(index.row());
  65.   }
  66. }
  67. Widget::~Widget()
  68. {
  69. }

最后

以上就是欢喜花卷为你收集整理的Qt深入浅出(十八)MySql的使用MySql的使用的全部内容,希望文章能够帮你解决Qt深入浅出(十八)MySql的使用MySql的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部