我将数据存储在MySQL中的表 MyTable 中,并使用Qt QSqlQueryModel将其显示在tableView中。所以现在我有一个显示表信息的对话框。例如, MyTable 是:
id name
01 Bird
02猫
03狗
04鱼
现在我想通过在Qt GUI中添加新的listView来添加类别表。例如,表格 MyLocation 可以是:
ID位置
01所有地点
02陆地
03 Else
我想用Qt模型/视图样式操纵这两个表。我如何连接两个表,所以当我点击
所有地点
在listView中,在tableView中显示MyTable中的所有项目?当我点击
listView中的在陆地上
,仅在tableView中
02猫
03狗
显示?
我知道QSqlRelationalTableModel可以显示两个有朋友关系的表,但在我的情况下,如何根据父子关系创建模型?虽然Qt GUI中的listView显示了类别,但tableView显示了该组中的项目?
我正在考虑创建一些表来将元素存储在不同的组中,因为一个项目可以同时在第1组和第2组中。
答案 0 :(得分:0)
两个模型(QSqlTableModel应该没问题),一个用于位置,一个用于动物,不需要在Qt中以某种方式相互显式连接,而它们在SQL端进行。 对于动物,架构应该是:
(id, name, location_id)
其中location_id是表MyLocation上的外键。 当QListView上的当前位置发生变化时,执行当前位置id并激活一个改变动物模型中WHERE子句的槽。
void doFilter(int location)
{
animals_model.setFilter(QString("location_id=%1").arg(location_id));
animals_model.select();
}
当用户选择“所有位置”时,激活另一个插槽以清除过滤器:
void resetFilter()
{
animals_model.setFilter("");
animals_model.select();
}
简而言之:第一个模型让用户选择一个作为第二个查询过滤器的东西。
答案 1 :(得分:0)
您需要更好地设计表格。 有两种方法可以做到这一点。这是最简单的一个,但我不推荐它用于专业用途。
方法一 - 标记记录
动物表看起来像这样: {animal_id,name,is_land,is_river,is_lake,is_air,is_ocean,is_mountain,is_valey,is_north_pole,is_africa,.......等等。)
这非常愚蠢,但它完成了工作。
方法二 - 交叉点矩阵
我不确定十字路口矩阵是否对英语有任何意义,但在90年代科索沃普里什蒂纳大学的计算机科学中它被称为阿尔巴尼亚语“Matricaekryqëzimeve”
你应该有3张桌子。
使用此方法的程序更难,因为SQL不是这样制作的,但在查询数据库时速度非常快。
这里的想法很简单。如果动物属于某个位置,您只需使用animal_id和loc_id在矩阵表中添加记录。您可以为同一动物添加多个位置,例如
INSERT INTO ani_loc_matrix VALUES (01, 01)
其中第一个01是鱼的id,第二个01是海洋的id。
如果您的位置表有这样的内容:
...您可以添加以下内容
INSERT INTO ani_loc_matrix VALUES (01, 01)
INSERT INTO ani_loc_matrix VALUES (01, 02)
INSERT INTO ani_loc_matrix VALUES (01, 03)
INSERT INTO ani_loc_matrix VALUES (01, 04)
INSERT INTO ani_loc_matrix VALUES (01, 05)
要检查北极是否有鱼类型:
SELECT * FROM ani_loc_matrix WHERE animal_id=01 AND loc_id=07
查找所有鱼类位置
SELECT * FROM ani_loc_matrix WHERE animal_id=01
找到生活在所有水域的东西
SELECT * FROM ani_loc_matrix WHERE loc_id=01 OR loc_id=02 OR loc_id=03 OR loc_id=04 OR loc_id=05 OR loc_id=06
要获取实际动物名称,您必须加入表格: SELECT * FROM animals as a,ani_loc_matrix as m WHERE a.animal_id = m.animal_id AND m.animal_id = 01
享受。
(FLOSSK会员)