Qt模型/视图编程中的MySQL表关系

时间:2012-03-21 00:19:57

标签: mysql qt

我将数据存储在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组中。

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张桌子。

  1. 动物(animal_id,姓名)
  2. 地点(loc_id,名称)
  3. ani_loc_matrix(animal_id,loc_id)
  4. 使用此方法的程序更难,因为SQL不是这样制作的,但在查询数据库时速度非常快。

    这里的想法很简单。如果动物属于某个位置,您只需使用animal_id和loc_id在矩阵表中添加记录。您可以为同一动物添加多个位置,例如

    INSERT INTO ani_loc_matrix VALUES (01, 01) 
    

    其中第一个01是鱼的id,第二个01是海洋的id。

    如果您的位置表有这样的内容:

    • 01 Ocean
    • 02 Sea
    • 03 Lake
    • 04 River
    • 06 Pond
    • 07 North Pole

    ...您可以添加以下内容

    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会员)