我是靠谱客的博主 欢喜花卷,这篇文章主要介绍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. ​
  17. ​
  18.    QSqlQuery sql(db);
  19. ​
  20.    if(!sql.exec("SELECT * FROM test_tb11")) //exec返回true代表执行SQL语句成功
  21.   {
  22.        qDebug() << sql.lastError().text() << endl;
  23.   }
  24. ​
  25.    while(sql.next()) //获取下一条记录,如果没有下一条则返回false。
  26.   {
  27.        qDebug() << sql.value("name").toString() << endl
  28.                  << sql.value("age").toString() << endl
  29.                    << sql.value("sub_date").toString() << endl;
  30.   }
  31. ​
  32.    if(!sql.exec("DELETE FROM test_tb WHERE name = 'Zhangsan'"))
  33.   {
  34.        qDebug() << sql.lastError().text() << endl;
  35.   }
  36. ​
  37.    if(!sql.exec("UPDATE test_tb SET age=99 WHERE name = 'Lisi'"))
  38.   {
  39.        qDebug() << sql.lastError().text() << endl;
  40.   }
  41. ​
  42. ​
  43.    db.close();
  44.    return 0;
  45. }

  • 事务常用函数


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

​ 以上例子通过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. ​
  14.    initMySql();
  15.    _view = new QTableView;
  16.    vBox->addWidget(_view);
  17.    _view->setModel(_sqlModel);
  18. ​
  19. ​
  20.    QHBoxLayout* hBox = new QHBoxLayout;
  21.    vBox->addLayout(hBox);
  22.    QPushButton* pb_sub = new QPushButton("提交");
  23.    hBox->addWidget(pb_sub);
  24.    /*按钮按下触发submitAll*/
  25.    connect(pb_sub, SIGNAL(clicked()),  _sqlModel, SLOT(submitAll()));
  26. ​
  27. }
  28. ​
  29. ​
  30. void Widget::initMySql()
  31. {
  32.    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  33.    db.setHostName("127.0.0.1");
  34.    db.setDatabaseName("TESTDB");
  35.    db.setUserName("root");
  36.    db.setPassword("root");
  37.    if(!db.open())
  38.   {
  39.        qDebug() << "db open failed" << endl;
  40.   }
  41.    _sqlModel = new QSqlTableModel(this, db);
  42.    _sqlModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置为手动提交
  43.    _sqlModel->setTable("test_tb");
  44.    _sqlModel->select();
  45.  // _sqlModel->removeColumn(1); //不显示第二列
  46. }
  47. ​
  48. Widget::~Widget()
  49. {
  50. ​
  51. }

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. ​
  4. #include <QWidget>
  5. class QTableView;
  6. class QSqlTableModel;
  7. class Widget : public QWidget
  8. {
  9.    Q_OBJECT
  10. ​
  11. public:
  12.    Widget(QWidget *parent = 0);
  13.    ~Widget();
  14. public slots:
  15.    void addSlot();
  16.    void deleteSlot();
  17. private:
  18.    void initMySql();
  19. private:
  20.    QTableView* _view;
  21.    QSqlTableModel* _sqlModel;
  22. ​
  23. ​
  24. };
  25. ​
  26. #endif // WIDGET_H
  27. ​

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

最后

以上就是欢喜花卷最近收集整理的关于Qt深入浅出(十八)MySql的使用MySql的使用的全部内容,更多相关Qt深入浅出(十八)MySql内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部