6462|1

661

帖子

18

TA的资源

纯净的硅(初级)

楼主
 

Qt学习之路第57篇 可视化显示数据库数据 [复制链接]

前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法。显然,使用 QSqlQuery 的方式更灵活,功能更强大,而使用 QSqlTableModel 则更简单,更方便与 model/view 结合使用(数据库应用很大一部分就是以表格形式显示出来,这正是 model/view 的强项)。本章我们简单介绍使用 QSqlTableModel 显示数据的方法。当然,我们也可以选择使用 QSqlQuery 获取数据,然后交给 view 显示,而这需要自己给 model 提供数据。鉴于我们前面已经详细介绍过如何使用自定义 model 以及如何使用 QTableWidget,所以我们这里不再详细说明这一方法。



我们还是使用前面一直在用的 student 表,直接来看代码:

  • int main(int argc, char *argv[])
  • {
  •     QApplication a(argc, argv);
  •     if (connect("demo.db")) {
  •         QSqlTableModel *model = new QSqlTableModel;
  •         model->setTable("student");
  •         model->setSort(1, Qt::AscendingOrder);
  •         model->setHeaderData(1, Qt::Horizontal, "Name");
  •         model->setHeaderData(2, Qt::Horizontal, "Age");
  •         model->select();
  •         QTableView *view = new QTableView;
  •         view->setModel(model);
  •         view->setSelectionMode(QAbstractItemView::SingleSelection);
  •         view->setSelectionBehavior(QAbstractItemView::SelectRows);
  • //        view->setColumnHidden(0, true);
  •         view->resizeColumnsToContents();
  •         view->setEditTriggers(QAbstractItemView::NoEditTriggers);
  •         QHeaderView *header = view->horizontalHeader();
  •         header->setStretchLastSection(true);
  •         view->show();
  •     } else {
  •         return 1;
  •     }
  •     return a.exec();
  • }

[color=rgb(0, 204, 255) !important]复制代码

这里的 connect() 函数还是我们前面使用过的,我们主要关注剩下的代码。



正如前一章的代码所示,我们在 main() 函数中创建了 QSqlTableModel 对象,使用 student 表。student 表有三列:id,name 和 age,我们选择按照 name 排序,使用 setSort() 函数达到这一目的。然后我们设置每一列的列头。这里我们只使用了后两列,第一列没有设置,所以依旧显示为列名 id。



在设置好 model 之后,我们又创建了 QTableView 对象作为视图。注意这里的设置:单行选择,按行选择。resizeColumnsToContents() 说明每列宽度适配其内容;setEditTriggers() 则禁用编辑功能。最后,我们设置最后一列要充满整个窗口。我们的代码中有一行注释,设置第一列不显示。由于我们使用了 QSqlTableModel 方式,不能按列查看,所以我们在视图级别上面做文章:将不想显示的列隐藏掉。



接下来运行代码即可看到效果:




数据库显示



如果看到代码中很多“魔术数字”,更好的方法是,使用一个枚举将这些魔术数字隐藏掉,这也是一种推荐的方式:

  • enum ColumnIndex
  • {
  •     Column_ID = 0,
  •     Column_Name = 1,
  •     Column_Age = 2
  • };
  • int main(int argc, char *argv[])
  • {
  •     QApplication a(argc, argv);
  •     if (connect("demo.db")) {
  •         QSqlTableModel *model = new QSqlTableModel;
  •         model->setTable("student");
  •         model->setSort(Column_Name, Qt::AscendingOrder);
  •         model->setHeaderData(Column_Name, Qt::Horizontal, "Name");
  •         model->setHeaderData(Column_Age, Qt::Horizontal, "Age");
  •         model->select();
  •         QTableView *view = new QTableView;
  •         view->setModel(model);
  •         view->setSelectionMode(QAbstractItemView::SingleSelection);
  •         view->setSelectionBehavior(QAbstractItemView::SelectRows);
  •         view->setColumnHidden(Column_ID, true);
  •         view->resizeColumnsToContents();
  •         view->setEditTriggers(QAbstractItemView::NoEditTriggers);
  •         QHeaderView *header = view->horizontalHeader();
  •         header->setStretchLastSection(true);
  •         view->show();
  •     } else {
  •         return 1;
  •     }
  •     return a.exec();
  • }


最新回复

真有耐心啊?  详情 回复 发表于 2018-5-22 13:20
点赞 关注

回复
举报

1903

帖子

0

TA的资源

版主

沙发
 
真有耐心啊?
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表