QT使用数据库QSqlRelationTableModel显示模型(外键显示)

1. 打开数据库,建一个city表,插入数据,如图:

我只用了id integer primar key auto_increment.

2. QT新建一个不带ui的项目,连接数据库

QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");//选择连接类型
db.setHostName("localhost");//设置设备名
db.setDatabaseName("Learn_References");//连接库名
db.setPort(3306);//设置端口 默认为3306
db.setUserName("root");//登录用户名
db.setPassword("1111");//用户名密码
if(!db.open())//打开失败返回错误窗口
    QMessageBox::warning(this,"",db.lastError().text());

3. 创建一个student表,字段(id、name、age、address),并设置address为city表id的外键。

QSqlQuery query;
if(!query.exec("create table student("
               "id integer primary key auto_increment,"
               "name varchar(20),"
               "age integer,"
               "address integer,"
               "foreign key(address) references city(id)"
               ")"))
    QMessageBox::warning(this,"",query.lastError().text());

4. 插入数据

insert into student (name, age, address) values ('AAA', 20, 2);
insert into student (name, age, address) values ('BBB', 25, 1);
insert into student (name, age, address) values ('CCC', 22, 4);
insert into student (name, age, address) values ('DDD', 23, 5);
... ...

5. 使用QSqlTableModel显示数据

QSqlTableModel * model = new QSqlTableModel(this,db);
model->setTable("student");
model->select();

这样执行成果是这样的:

6. 可以发现,其中address栏是我们插入的数字,那么与city表中的cityname连接则需要使用QSqlRelationalTableModel。

QSqlRelationalTableModel * model = new QSqlRelationalTableModel(this);
model->setTable("student");
model->setRelation(3,QSqlRelation("city","id","cityname"));

解释下model->setRelation(3,QSqlRelation("city","id","cityname"));

3 是使用外键的列号
QSqlRelation原型:
	QSqlRelation(const QString &aTableName, const QString &indexCol,const QString &displayCol)
所以可以理解为(关联_表名,关联外键_字段,替换_字段)

执行后是这样的

!!!注意!!!
如果你用的是mysql,那么直接可以使用。如果你用的是sqlite,需要执行query.exec("pragma foreign_keys = on");开启外键功能。

  • 界面构造函数中全部代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
	//连接数据库
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("Learn_References");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("1111");
    if(!db.open())
        QMessageBox::warning(this,"",db.lastError().text());

//	创建student表
//    QSqlQuery query;
//    if(!query.exec("create table City("
//                   "id integer primary key auto_increment,"
//                   "name varchar(20),"
//                   "age integer,"
//                   "address integer),"
//                   "foreign key(address) references city(name)"
//                   ")"))
//        QMessageBox::warning(this,"",query.lastError().text());

//        if(!query.exec("insert into student (name,age,address) values('AAA',21,5)"))
//            QMessageBox::warning(this,"",query.lastError().text());
    
//常规显示
//    QSqlTableModel * model = new QSqlTableModel(this,db);
//    model->setTable("student");

//QSqlRelationalTableModel显示
        QSqlRelationalTableModel * model = new QSqlRelationalTableModel(this);
        model->setTable("student");
        model->setRelation(3,QSqlRelation("city","id","cityname"));

//显示
        QTableView * view = new QTableView(this);
        view->setModel(model);
        model->select();
        setCentralWidget(view);
}
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值