2012-03-21 46 views
0

我在MySQL中存儲數據表MyTable,並使用Qt QSqlQueryModel將其顯示在tableView中。所以現在我有一個對話框來顯示錶格信息。例如,MyTable的是:在Qt模型/視圖編程中的MySQL表關係

ID名稱

01伯德

02貓

03狗

04魚類

現在我想添加一個類別通過在Qt GUI中添加一個新的listView。例如,表MyLocation可以是:

ID位置

01所有地點

02在陸地上

03否則

我要操縱這兩個具有Qt Model/View樣式的表格。我如何連接兩個表,所以當我點擊

所有位置

ListView中

,在在的tableView的MyTable所有項目都顯示?當我點擊

在陸地上

ListView中

,在只的tableView

02貓

03狗

顯示?

我知道QSqlRelationalTableModel可以顯示兩個朋友關係表,但在我的情況下,我怎麼能創建一個基於父子關係的模型?當Qt GUI中的listView顯示類別時,tableView顯示該組內的項目?

我正在考慮創建一些表來將元素存儲在不同的組中,因爲一個項目可以同時在組1和組2中。

回答

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(); 
} 

簡而言之:第一模型讓用戶選擇的東西,其作爲過濾器的查詢在第二個。

+0

謝謝您向我展示setFilter的功能然而,動物中的一個元素可以屬於多個位置,例如,魚可以位於「海」,「河」和「所有位置」的位置。但是location_id只會顯示一個地方,魚可以分成幾個地方。我正在考慮做一堆桌子來分組不同的地方,比如,桌上的海里會有所有的動物的ID在海里生活,桌上的河裏會有所有動物的ID,所以動物桌上的一個元素可以屬於海洋和河流。我想知道如何在QSqlQueryModel中做到這一點。謝謝! – Sean 2012-03-21 17:42:42

0

您需要對錶格進行更好的設計。 有兩種方法可以做到這一點。首先是簡單的,但我不推薦它用於專業用途。

方法一 - 舉報記錄

動物表是這樣的: {animal_id,名稱,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個表格。

  1. 動物(animal_id,名)
  2. 位置(loc_id,名)
  3. ani_loc_matrix(animal_id,loc_id)

這是很難的程序與此方法,因爲SQL不進行這樣,但查詢數據庫時速度驚人。

這裏的想法很簡單。如果動物屬於某個位置,則只需在matrix_table中添加一個記錄,並添加一個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 

爲了讓你有連接表的實際動物名稱: SELECT * FROM動物作爲,ani_loc_matrix爲m WHERE a.animal_id = m.animal_id AND m.animal_id = 01

享受。 (FLOSSK會員)