2016-08-04 620 views
0

我在一個數據庫上使用Qt的模型視圖編程,其中一個對象使用多個表格表示。假設這完全符合我設計了以下對象和coresponding數據庫表:多個表上的QSqlTableModel

TagObject 
    - id 
    - name 
    - usable 
    - information 

tag_table 
    - id 
    - name 
    - usable 

tag_info_table 
    - id_ref 
    - info 

正如你可以看到,信息財產被分離到另一個表,以防止NULL的存在因爲這個屬性是可選的。

在數據庫中,我有一個視圖,它將這些值彙總到一個'表',可以使用QSqlTableModel查詢。請注意,INSERT ing數據是不可能的。據我所知,Qt的類不支持數據庫設計,QSqlTableModelQSqlRelationalTableModel都不支持這一點。 (另外QSqlQueryModel根本不支持插入,所以這是沒有問題的。)

我錯過了什麼嗎?有沒有辦法使用Qt的SQL類來做到這一點?或者如here指出的那樣實現這個子類QSqlQueryModel的唯一方法?

該模型默認爲只讀模式。爲了使其可讀寫,您必須對其進行子類化並重新實現setData()和flags()。另一種選擇是使用QSqlTableModel,它提供基於單個數據庫表的讀寫模型。


編輯:至於子類,我發現this reference作爲一個很好的切入點。

回答

2

理想情況下,視圖應該有適當的觸發器來修改底層表。使視圖可寫,並且問題消失:然後,您可以直接在該視圖上使用QSqlTableModel

或者,您可以爲每個表創建一個QSqlTableModel,然後編寫一個自定義代理模型,該模型支持在源模型之間插入和轉換並形成可寫視圖。這將比編寫SQL觸發器更多的工作。

+0

兩種不同於我的好方法,很好。我會深入研究這一點。 – maxik

+0

我最終在視圖上使用了一個完美的觸發函數。我喜歡將盡可能多的邏輯放入數據庫。謝謝! – maxik

+1

進入另一個與我相關的問題:使用觸發視圖,如何處理不在視圖內的* n:m *關係?有什麼好方法讓他們成爲一體?我有*代理鍵*表映射兩個表的id來獲得關係。 – maxik