我将数据存储在MySQL中的表MyTable中,并使用Qt QSqlQueryModel将其显示在tableView中。现在我有一个对话框显示表格信息。例如,MyTable是:
id名称
01 Bird
02 Cat
03狗
04鱼类
现在我想通过在QtGUI中添加一个新的listView来添加一个类别表。例如,表MyLocation可以是:
id位置
01所有位置
02陆地
03其他
我想用Qt模型/视图样式操作这两个表。我如何连接两个表,所以当我点击时
所有位置
在listView中,在tableView中是否显示MyTable中的所有项目?当我点击时
陆地
在listView中,在tableView中仅
02 Cat
03狗
是否显示?
我知道QSqlRelationalTableModel可以显示两个具有朋友关系的表,但在我的情况下,如何创建基于父子关系的模型?当Qt GUI中的listView显示类别时,tableView显示该组中的项目?
我正在考虑创建一些表来将元素存储在不同的组中,因为一个项目可以同时位于组1和组2中。
这两个模型(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();
}
简言之:第一个模型允许用户在第二个模型上选择充当查询过滤器的东西。
您需要对表进行更好的设计。有两种方法可以做到这一点。这里首先是一个简单的,但我不建议专业人士使用。
方法一-标记记录
动物餐桌看起来是这样的:{animal_id、name、is_land、is_river、is_lake、is_air、is_ocean、is_mountain、is_valey、is_north_pole、is_africa等)
这很愚蠢,但它能完成任务。
方法二-交集矩阵
我不确定交集矩阵在英语中是否有意义,但在90年代科索沃普里什蒂纳大学的计算机科学中,它在阿尔巴尼亚语中被称为"Matrica e kryqëzimeve"
你应该有3张桌子。
- 动物(animal_id,名称)
- 位置(loc_id,name)
- ani_loc_matrix(animal_id,loc_id)
使用这种方法编程比较困难,因为SQL不是这样生成的,但它在查询数据库时速度惊人。
这里的想法很简单。如果一只动物属于某个位置,只需在矩阵表中添加一条带有animal_id和loc_id的记录。您可以为同一只动物添加多个位置,例如
INSERT INTO ani_loc_matrix VALUES (01, 01)
其中第一个01是鱼的id,第二个01是海洋的id。
如果你的位置表有这样的东西:
- 01海洋
- 02大海
- 03湖
- 04河流
- 06池塘
- 07北极
你可以添加以下
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
要获得实际的动物名称,您必须加入表格:从动物中选择*作为a,ani_loc_matrix作为m,其中a.animal_id=m.animal_id和m.animal_id=01
享受吧。
(FLOSSK成员)