首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从QSqlQueryModel生成QSqlTableModel

从QSqlQueryModel生成QSqlTableModel
EN

Stack Overflow用户
提问于 2020-01-26 05:50:07
回答 2查看 325关注 0票数 0

有没有一种方法可以从QSqlQueryModel生成QSqlTableModel,因为QSqlTableModel继承了QSqlQueryModel。

或者,我是否必须创建一个新的QSqlTableModel,遍历QSqlQueryModel并将带有"insertRow“和"setData”的数据插入到QSqlTableModel中?

问题是:

我得到了一个(抽象的)自定义小部件(my_custom_widget),其中包含一个用于在表中显示数据的QTableView (table_view)。我通常使用如下的QSqlTableModel从我的SQLite数据库中获取数据:

代码语言:javascript
复制
my_model = QSqlTableModel()
my_model.setTable("my_table")
my_model.select()

有时我有一个额外的"where"-clause。然后它看起来是这样的:

代码语言:javascript
复制
my_model = QSqlTableModel()
my_model.setTable("my_table")
my_model.setFilter("filter_column='"+filter_str+"'")
my_model.select()

属性"filter_str“来自my_custom_widget中的附加输入小部件(例如,QLineEdit或QSpinBox)。用户现在可以在我的自定义小部件中限制table_view中的数据。

我将my_model传递给my_custom_widget以显示数据。我在my_custom_widget中有几种方法可以设置tabel_view的布局(设置标题标签、列对齐等)。或使用某些列进行计算。我还使用QSortFilterProxyModel实现了一个扩展的过滤器。在这里,我使用QSqlTableModel来实现这些事情。

但现在我想在my_custom_widget中显示一个复杂的级联查询,如下所示:

在这个查询中,需要设置多个"where"-clause (在我的示例中是“filter_str”)。因为我不能通过使用带有'setFilter‘的QSqlTableModel来实现这一点,所以我想我可以使用像这样的QSqlQueryModel来实现:

代码语言:javascript
复制
my_sql_query_model = QSqlQueryModel()
my_sql_query_model.setQuery("SELECT d1.* FROM "
                             "(SELECT site.id AS id, nr, site.name, "
                             "site_typ.name AS typ, site_size.site_size_from AS year, "
                             "site_size.site_area FROM site "
                             "LEFT JOIN site_size ON site.id = site_size.site_id, "
                             "site_typ ON site_size.site_typ_id = site_typ.id "
                             "WHERE site_size.site_size_from <= "+str(filter_str)+") d1 "
                             "LEFT JOIN (SELECT site.id AS id, nr, site.name, "
                             "site_typ.name AS typ, site_size.site_size_from AS year, "
                             "site_size.site_area FROM site LEFT JOIN site_size "
                             "ON site.id = site_size.site_id, site_typ "
                             "ON site_size.site_typ_id = site_typ.id "
                             "WHERE site_size.site_size_from <= "+str(filter_str)+") d2 "
                             "ON (d1.id = d2.id AND d1.year < d2.year) "
                             "WHERE d2.id IS NULL ORDER BY nr ASC;",
                             db=my_database())

当我使用一个普通的QTableView时,这是最好的选择。但是在my_custom_widget中,我有几个使用QSqlTableModel的方法,现在我很乐意将QSqlQueryModel传递给my_custom_widget。这会导致几个错误。

所以我想,可以从QSqlQueryModel生成QSqlTableModel (因为QSqlTableModel继承了QSqlQueryModel)。

或者更好的方法是(就像答案的第三点所说的那样)创建一个空的QSqlTableModel,然后用来自my_sql_query_model的数据填充它。

EN

回答 2

Stack Overflow用户

发布于 2020-01-26 06:08:13

SQL类为QSqlQueryModel结果集提供只读数据模型。

但是,您可以

  • 改用QSqlTableModel
  • 先将数据插入数据库,或
  • 创建自己的QAbstractItemModel,其中包含QSqlQueryModel并允许添加行
票数 0
EN

Stack Overflow用户

发布于 2020-07-30 11:24:47

您应该在SQL数据库中创建一个视图

代码语言:javascript
复制
CREATE VIEW AS tableview
SELECT * FROM table

在这里,您可以使用常规的QSqlTableModel并将表设置为视图的名称,从您的小部件中进行过滤仍然可以正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59913707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档