IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Qt数据库练习之QSqlRelationalTableModel的使用(MySql数据库示例,含源码+注释) -> 正文阅读

[大数据]Qt数据库练习之QSqlRelationalTableModel的使用(MySql数据库示例,含源码+注释)

一、操作示例

1.1 源数据表图片

EmployeeInfo(员工信息表):
在这里插入图片描述
PositionInfo(职位信息表):
在这里插入图片描述

1.2 关系字段操作示例

下图为关系字段操作示例图,其中双击职位列某行后,会弹出代理控件,供用户选择(在本文中控件失去焦点则修改数据)。
提示:示例图中开始先刷新了数据表,表明数据为最新数据;源码在本文第三节(源码含详细注释)。
在这里插入图片描述

提示:不会使用Qt设计师设计界面的小伙伴点击这里

二、了解QSqlRelationalTableModel

  1. 因为是sql操作,所以需要在pro文件添加“QT += sql”;
  2. QSqlRelationalTableModel继承自QSqlTableModel类,所以QSqlTableModel的功能在该类中都能是实现(在本文中就不一一实现了,有兴趣的小伙伴可以查看QSqlTableModel的使用);
  3. 若要实现两表关联,需要使用QSqlRelationalTableModel特有的setRelation函数,该函数能指定当前表和其他的关联字段,并将显示内容换成关联表中的指定字段的内容;
  4. 使用了QSqlRelationalTableModel,并且当前表中有关联字段,就需要使用QSqlRelationalDelegate类添加代理控件(关于代理控件,我之前有过文章说过,有兴趣的小伙伴可以查看),提供关联字段信息的选择。

三、源码

3.1 CSqlTest.h

#ifndef CSQLTEST_H
#define CSQLTEST_H

#include <QMainWindow>
#include <QSqlRelationalTableModel>

namespace Ui {
class CSqlTest;
}

class CSqlTest : public QMainWindow
{
    Q_OBJECT

public:
    explicit CSqlTest(QWidget *parent = 0);
    ~CSqlTest();

private:
    Ui::CSqlTest *ui;

    QSqlRelationalTableModel  * m_pModel;      //数据模型对象

    QSqlDatabase                m_db;           //数据库对象
};

#endif // CSQLTEST_H

3.2 CSqlTest.cpp

#include "CSqlTest.h"
#include "ui_CSqlTest_3.h"

#include <QDebug>
#include <QSqlError>
#include <QSqlRelationalDelegate>

CSqlTest::CSqlTest(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CSqlTest)
{
    ui->setupUi(this);
    this->setWindowTitle("QSqlRelationTableModel测试");

//-----------------------连接数据库-----------------------
    //指定数据库类型
    m_db = QSqlDatabase::addDatabase("QMYSQL");
    //设置主机名、用户名、密码、端口号等信息(若是使用SQLite数据库这些信息无需设置,仅指定数据库名即可)
    m_db.setHostName("127.0.0.1");
    m_db.setUserName("root");
    m_db.setPassword("123456");
    m_db.setPort(3306);
    //指定数据库名
    m_db.setDatabaseName("test");
    if(!m_db.open())
    {
        qDebug() << "打开数据库失败!" << m_db.lastError().text();
                    return;
    }

//-----------------------QSqlRelationalTableModel-----------------------
    //为数据模型设置父对象、数据库对象
    m_pModel = new QSqlRelationalTableModel(this, m_db);
    //指定数据源表
    m_pModel->setTable("EmployeeInfo");
    //设置数据更新模式(行/列某值更新时hi立即更新到数据库)
    //! QSqlTableModel::OnFieldChange 字段值变化时立即更新到数据库中
    //! QSqlTableModel::OnRowChange 当前行变化时才将修改值更新到数据库中
    //! QSqlTableModel::OnManualSubmit 修改是数据暂存,需要手动提交
    //! 因为QSqlRelationalTableModel继承QSqlTableModel所以这里使用QSqlTableModel获取对应值也有效
    m_pModel->setEditStrategy(QSqlTableModel::OnFieldChange);

    //! 设置关联字段及其关联表
    //! 4:当前表中下标为4的字段
    //! QSqlRelation中参数含义依次为:关联表,关联字段(显示内容的ID或别名字段),信息字段(给用户显示的字段内容)
    m_pModel->setRelation(4, QSqlRelation("positionInfo", "positionId", "positionName"));

    //设置数据模型的关联字段代理控件
    ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));

    //查询数据
    if(!m_pModel->select())
    {
        qDebug() << "数据查询失败!!" << m_pModel->lastError().text();
        return;
    }

    //设置数据模型指定列的列标题(若是不设置,则标题为和数据表上一样)
    m_pModel->setHeaderData(0, Qt::Horizontal, "工号");
    m_pModel->setHeaderData(1, Qt::Horizontal, "姓名");
    m_pModel->setHeaderData(2, Qt::Horizontal, "年龄");
    m_pModel->setHeaderData(3, Qt::Horizontal, "身高");
    m_pModel->setHeaderData(4, Qt::Horizontal, "职位");

    //将数据模型设置到tableView控件上
    ui->tableView->setModel(m_pModel);
}

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

#endif

总结

本文仅演示了QSqlRelationalTableModel包含关联字段的操作,对其增删查改操作有兴趣的小伙伴可以查看QSqlTableModel的使用。好吧,今天就到此为此吧,大家晚安!

相关文章

Qt数据库练习之Qt SQLITE的使用(从无到有,含源码+注释)
Qt数据库练习之QSqlQuery、QSqlQueryModel的简单使用(含源码+注释)
Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:58:25  更:2022-05-10 12:02:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:16:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码