有没有一种方法可以从QSqlQueryModel生成QSqlTableModel,因为QSqlTableModel继承了QSqlQueryModel。
或者,我是否必须创建一个新的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"-clause。然后它看起来是这样的:
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来实现:
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的数据填充它。
发布于 2020-01-26 06:08:13
SQL类为QSqlQueryModel结果集提供只读数据模型。
但是,您可以
QSqlTableModel或QAbstractItemModel,其中包含QSqlQueryModel并允许添加行发布于 2020-07-30 11:24:47
您应该在SQL数据库中创建一个视图
CREATE VIEW AS tableview
SELECT * FROM table在这里,您可以使用常规的QSqlTableModel并将表设置为视图的名称,从您的小部件中进行过滤仍然可以正常工作。
https://stackoverflow.com/questions/59913707
复制相似问题