从QSqlQueryModel生成QSqlTableModel

问题描述 投票:0回答:1

[您知道QSqlTableModel继承了QSqlQueryModel的情况下,有没有一种方法可以从QSqlQueryModel制作QSqlTableModel。

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

问题:

我有一个(抽象的)自定义窗口小部件(my_custom_widget),其中包含一个QTableView(table_view)以在表中显示数据。我通常使用这样的QSqlTableModel从我的SQLite数据库中获取数据:

my_model = QSqlTableModel()
my_model.setTable("my_table")
my_model.select()

有时我还有一个附加的“ where”子句。然后看起来像这样:

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中显示一个复杂的级联查询,如下所示:

enter image description here

在此查询中,必须设置多个“ where”子句(在我的示例中为“ filter_str”)。因为我无法通过将QSqlTableModel与'setFilter'一起使用来实现这一点,所以我认为可以使用QSqlQueryModel这样实现:

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中的数据填充它(如答案的第3点中的'Redanium'所述。)>

有一种从QSqlQueryModel制作QSqlTableModel的方法,您知道QSqlTableModel继承了QSqlQueryModel。还是我必须创建一个新的QSqlTableModel,通过QSqlQueryModel进行迭代...

python pyqt
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.