2

我的目標是爲數據庫創建一個胖客戶端。基本上全部是關於管理三個數據列表。Qt厚數據庫客戶端體系結構

我想將我的應用程序分成不同的層,所以使用Qt的Model/View框架對我來說似乎很自然。

  • 什麼時候應該創建QSql *模型實例?

我需要能夠連接/斷開/從數據庫多次(我有菜單項)。我不滿意刪除一堆模型,並在每次連接/斷開連接時再次創建它們。

有沒有其他的方法?

  • 我應該在哪裏創建QSql *模型實例?

我不認爲主窗口或任何其他GUI相關的類應該持這樣的代碼:

m_goodsModel->setRelation(1, QSqlRelation("Level", "LevelId", "Name")); 

我想解耦從數據結構的GUI。任何想法如何做到這一點?

  • 何時何地應將視圖與模型綁定?

我需要用十幾種方式來表示我的三個列表。如果我每次連接/斷開連接都重新創建模型,我需要再次將新創建的模型注入到所有視圖中。

如果我只能做到一次,那將會很棒,但我不知道該怎麼做。

  • 怎麼辦與討厭QSqlTableModel::select()方法?

這個讓我發瘋。與其他模型(例如QStringListModelQFileSystemModel等)相比,數據即可立即使用,QSqlTableModel派生的模型在您手動調用它們的select()方法之前是無用的。在該調用之前,該模型是空的,以及使用該模型的視圖;標題數據也沒有被填充,所以視圖甚至不知道它必須呈現哪些列。

因爲我不能避免select()調用我不知道我應該把它放在哪裏,以便它很好?我不認爲MainWindow或任何其他GUI相關的類應該包含該代碼。

  • 性能和健壯性

我不開心重新初始化後重新連接數據庫一切。這需要很長時間(我的意思是執行期間)。我還希望避免模型娛樂過程中的崩潰,因爲視圖可能仍然會引用它們。

難道還沒有其他的方法來設置所有的東西只是一次,並妥善處理重新連接?

回答

1

在我看來,對所有這些問題的直接回答是將所有與數據庫相關的操作都包裝在專用類中,並在您的MainWindow/Dialog/whatever中保存一個指向此類實例的指針。

一個可能的設計可以是這樣的:

class DatabaseAccess : public QObject 
{ 
     Q_OBJECT 
    public: 
     void connectToDatabase(const QString & hostname, const QString & db, const QString & user, const QString & password); 
     void disconnectFromDatabse(); 

     QAbstractItemModel * getModelForX(); 
     QAbstractItemModel * getModelForY(); 

    private: 
     QSqlTableModel * modelForX; 
     QSqlRelationalTableModel * modelForY; 
} 

這裏,X和Y是爲你的應用程序有類型的查詢只是佔位符。

當您需要getModelForX/Y方法中的新數據時,您可以在connectToDatabase()中創建模型並調用select()

就我所知,您不能繼續使用具有不同數據庫連接的相同模型實例,因爲QSqlTableModel及其受害者綁定到QSqlDatabase實例。連接成功後,您需要刷新視圖。

+0

這基本上是我在做什麼。但是這種方法沒有解決模型注入和娛樂問題。 每次連接後我需要創建新模型還是可以重複使用舊模型?如果我被迫重新創建它們,那麼誰(即什麼類/層)負責模型注入? – 2010-08-19 23:26:09

+0

您必須重新創建模型 - 在連接關閉後它們變爲無效(請參閱http://doc.qt.nokia.com/4.6/qsqldatabase.html#removeDatabase)。 注入模型的圖層是知道視圖的圖層。可能是連接插槽中的主窗口。 – IgKh 2010-08-20 09:54:36

+0

事實上,我不''刪除()'QSqlDatabase,我只是'關閉()'它。這很重要嗎? – 2010-08-20 20:33:47