• QSqlRelationTableModel使用示例


    目录

    总述

    步骤

    代码

    效果

    解释


    总述

    QSqlRelationTableModel继承自QSqlTableModel。QSqlTableModel一方面从数据库中读取相关库表的内容,另一方面向界面tableview提供数据。而QSqlRelationTableModel不仅获取一个库表的内容,还根据该库表内某一列的内容查找到与之关联的另一个库表的对应列的信息。完整代码示例见我的资源qsqlrelationaltablemodel使用示例

    步骤

    建立一个qt应用来显示数据库的步骤如下:

    1 配置QSqlDatabase

    2 打开QSqlDatabase

    3 启动QSqlDatabase

    4 建立QSqlRelationTableModel

    5 将tableview与model关联

    6 model->select()

    代码

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. namespace Ui {
    8. class MainWindow;
    9. }
    10. class MainWindow : public QMainWindow
    11. {
    12. Q_OBJECT
    13. public:
    14. explicit MainWindow(QWidget *parent = 0);
    15. ~MainWindow();
    16. private:
    17. Ui::MainWindow * ui;
    18. QSqlDatabase m_db;
    19. //打开事务
    20. void openTransaction();
    21. void connectdatebase();
    22. void initModelHeaderData(QSqlRelationalTableModel *model, QStringList dataList);
    23. };
    24. #endif // MAINWINDOW_H
    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. #include
    5. MainWindow::MainWindow(QWidget *parent) :
    6. QMainWindow(parent),
    7. ui(new Ui::MainWindow)
    8. {
    9. ui->setupUi(this);
    10. connectdatebase();
    11. }
    12. MainWindow::~MainWindow()
    13. {
    14. delete ui;
    15. }
    16. void MainWindow::connectdatebase()
    17. {
    18. //1配置QSqlDatabase
    19. m_db = QSqlDatabase::addDatabase("QMYSQL");
    20. m_db.setHostName("192.168.4.202");
    21. m_db.setDatabaseName("test");
    22. m_db.setUserName("root");
    23. m_db.setPassword("");
    24. //2打开数据库
    25. bool b = m_db.open();
    26. qDebug()<
    27. //3开启事务
    28. openTransaction();
    29. QSqlRelationalTableModel *model;
    30. //4建立model
    31. model = new QSqlRelationalTableModel(nullptr, m_db);
    32. model->setTable("person");
    33. model->setRelation(0, QSqlRelation("addr","id","addr"));
    34. initModelHeaderData(model, QStringList() <<"地址"<<"姓名");
    35. //5关联tableview与model
    36. ui->tableView->setModel(model);
    37. //6
    38. model->select();
    39. }
    40. void MainWindow::openTransaction()
    41. {
    42. if(m_db.driver()->hasFeature(QSqlDriver::Transactions))
    43. {
    44. m_db.transaction();
    45. }
    46. }
    47. void MainWindow::initModelHeaderData(QSqlRelationalTableModel *model, QStringList dataList)
    48. {
    49. for(int i=0;icount();i++)
    50. {
    51. model->setHeaderData(i, Qt::Horizontal, dataList.at(i));
    52. }
    53. }

    效果

    解释

    通过navicat,我们可以看到数据库中有两张表:addr和person

    person包含两个数据项,id和name

    addr包含两个数据项,id和addr 

     在上面的代码中,注意以下两句:

    1. model->setTable("person");
    2. model->setRelation(0, QSqlRelation("addr","id","addr"));

    第一句将表格person与model关联起来。第二句的含义是,用person表格第0列的内容查询addr表格的id项,假如能查到对应条目,则找到该条目的addr内容,并用addr项的内容代替tableview中第0列内容显示出来。

    显然,person数据表里含有两个id:1,2;addr数据表也含有两个id:1,2。所以model将查询addr表里的两个id,并返回这两个id对应的地址LA和London。这两个地址将在tableview中作为第0列取代id显示出来。

    根据qt官方文档的说法,setTable与select的作用分别是:

    [virtual] void QSqlTableModel::setTable(const QString &tableName)

    Sets the database table on which the model operates to tableName. Does not select data from the table, but fetches its field information.

    To populate the model with the table's data, call select().

  • 相关阅读:
    【Liunx】配置IP地址与MAC地址绑定
    LeetCode 算法:二叉树的直径 c++
    web课程设计网页规划与设计 :DW旅游主题网页设计——凤阳智慧旅游官方-地方旅游网站模板html源码HTML+CSS+JavaScript
    解决Vision Transformer在任意尺寸图像上微调的问题:使用timm库
    webpack分环境打包(生产/开发两套打包)
    AVL树和红黑树的简单实现
    【记录文】Android自定义Dialog实现圆角对话框
    App测试时常用的adb命令你都掌握了哪些呢?
    分享几个关于Camera的坑
    正则系列之 Unicode 属性转义(Unicode Property Escapes)
  • 原文地址:https://blog.csdn.net/liji_digital/article/details/127714826