一、操作示例
1.1 源数据表图片
EmployeeInfo(员工信息表): PositionInfo(职位信息表):
1.2 关系字段操作示例
下图为关系字段操作示例图,其中双击职位列某行后,会弹出代理控件,供用户选择(在本文中控件失去焦点则修改数据)。 提示:示例图中开始先刷新了数据表,表明数据为最新数据;源码在本文第三节(源码含详细注释)。
提示:不会使用Qt设计师设计界面的小伙伴点击这里
二、了解QSqlRelationalTableModel
- 因为是sql操作,所以需要在pro文件添加“QT += sql”;
- QSqlRelationalTableModel继承自QSqlTableModel类,所以QSqlTableModel的功能在该类中都能是实现(在本文中就不一一实现了,有兴趣的小伙伴可以查看QSqlTableModel的使用);
- 若要实现两表关联,需要使用QSqlRelationalTableModel特有的setRelation函数,该函数能指定当前表和其他的关联字段,并将显示内容换成关联表中的指定字段的内容;
- 使用了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
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");
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;
}
m_pModel = new QSqlRelationalTableModel(this, m_db);
m_pModel->setTable("EmployeeInfo");
m_pModel->setEditStrategy(QSqlTableModel::OnFieldChange);
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, "职位");
ui->tableView->setModel(m_pModel);
}
CSqlTest::~CSqlTest()
{
delete ui;
}
#endif
总结
本文仅演示了QSqlRelationalTableModel包含关联字段的操作,对其增删查改操作有兴趣的小伙伴可以查看QSqlTableModel的使用。好吧,今天就到此为此吧,大家晚安!
相关文章
Qt数据库练习之Qt SQLITE的使用(从无到有,含源码+注释) Qt数据库练习之QSqlQuery、QSqlQueryModel的简单使用(含源码+注释) Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)
友情提示——哪里看不懂可私哦,让我们一起互相进步吧 (创作不易,请留下一个免费的赞叭 谢谢 ^o^/)
注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。 注:如有侵权,请联系作者删除
|