- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
C++Qt开发:SqlRelationalTable关联表组件
Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵活运用。
在上一篇文章中详细介绍了SqlTableModle组件是如何使用的,本篇文章将介绍SqlRelationalTable关联表组件,该该组件其实是SqlTableModle组件的扩展类,其提供了一个带关系的数据模型,用于处理数据库中的表与表之间的关系。通过这个类,你可以在一个表中使用外键关联到另一个表的数据上。例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,名称)就是用来实现多表之间快速关联的。
1.1ComboBox
首先我们来实现一个简单的联动效果,数据库组件可以与ComboBox组件形成多级联动效果,在日常开发中多级联动效果应用非常广泛,例如当我们选择指定用户时,让其在另一个ComboBox组件中列举出该用户所维护的主机列表,又或者当用户选择省份时,自动列举出该省份下面的城市列表等。
在进行联动之前需要创建两张表,表结构内容介绍如下:
User(id,name)表:存储指定用户的ID号与用户名
UserAddressList(id,name,address)表:与User表中的用户名相关联,存储该用户所管理的主机列表信息
通过数据库组件实现的联动非常简单,初始化表结构得到了两张表,当程序运行时默认在MAInWindow构造函数处填充第一个ComboBox组件,也就是执行一次数据库查询,并将结果通过addItem()放入到第一个组件内。
QSqlDatabasedb;
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow)
ui-setupUi(this);
InitMultipleSQL();
db=QSqlDatabase::addDatabase(QSQLITE
db.setDatabaseName(./database.db
if(!db.open())
std::coutdb.lastError().text().toStdString()std::endl;
return;
QSqlQueryquery;
query.exec(select*fromUser;
QSqlRecordrec=query.record();
while(query.next())
intindex_name=rec.indexOf(name
QStringdata_name=query.value(index_name).toString();
ui-comboBox_user-addItem(data_name);
而当用户选中了第一个ComboBox组件时,则让其转到槽函数on_comboBox_activated(constQStringarg1)上面,如下图所示;
该槽函数需要一个传入参数,此参数代表组件选中的文本内容,通过利用该文本内容在数据库内执行二次查询并将查询结果填充之对应的第二个ComboBox组件内即可实现组件的联动选择效果,其槽函数代码如下所示;
voidMainWindow::on_comboBox_user_activated(constQStringarg1)
if(db.open())
QSqlQueryquery;
query.prepare(select*fromUserAddressListwherename=:x
query.bindValue(:x,arg1);
query.exec();
QSqlRecordrec=query.record();
ui-comboBox_address-clear();
while(query.next())
intindex=rec.indexOf(address
QStringdata_=query.value(index).toString();
ui-comboBox_address-addItem(data_);
文档评论(0)