2013-10-31 32 views
0

我想了解模型和數據之間應該有什麼樣的關係。Qt模型查看模式,用於連接模型和數據的設計選擇

enter image description here


對於我目前的狀況,我有一個QTcpServer既可這使主動套接字的列表。

class TftpServer : public QTcpServer 
{ 
    Q_OBJECT 
public: 
    TftpServer(QObject *parent = 0) 
     :QTcpServer(parent) {} 
    QList<QTcpSocket *> m_activeSockets; 

的數據模型應該代表的視圖是QList<QTcpSocket *> m_activeSockets;

我覺得這樣做是爲了防止重複數據的任何費用,就能導致矛盾的正確途徑。意思是在任何時候View都應該代表真實狀態數據。

我已經嘗試了一些方法,沒有成功,因爲我有限的時間,我可以花費測試每種方法。

途徑:

TftpServer::m_activeSockets私人,模型可以訪問它通過getter和setter。

  • 缺陷:如何在模型中調用方法TftpServer::m_activeSockets

2.

型號友元類的TftpServer。直接訪問TftpServer::m_activeSockets

  • 無法執行。

TftpServer::m_activeSockets公衆。型號有公共參考

QList<QTcpSocket *> & m_activeSockets;TftpServer::m_activeSockets

  • 缺陷:公開可用的

我想找出最佳的解決方案(隨時提出)被認爲是最佳的敏感數據。

和聽到,如果他們不堅持單一數據源的優點(在這種情況下,模型將只擁有TftpServer::m_activeSockets副本作爲其上的更改參數和同步與它)。

+0

你(你的模型)需要從'QList '知道些什麼?尺寸?還有什麼? – vahancho

+0

@vahancho它將不得不從列表中訪問項目('QTcpSocket *')及其方法。例如,如果有人在View中點擊那個項目,他應該在GUI中的某個地方打印出'QTcpSocket :: peerName()'。 – TheMeaningfulEngineer

+0

那麼,如果你不想暴露敏感數據(在你的列表中的第3點)而不是在'TftpServer'類中實現包裝函數,比如'QString TftpServer :: peerName(int)'等等。模型根本不會處理QTcpSocket對象。 – vahancho

回答

1

你在濫用Qt的模型視圖體系結構 - 不需要傳遞實際的套接字。你想要的是建立一個連接列表的模型,所以只需要實現它。連接有一些參數 - 這些參數可以映射到模型的列,或者作爲子行,每個連接都是樹中的父項,具體取決於哪些更方便。模型應該提供的數據必須在可視化方面有意義。一個QTcpSocket是沒有什麼可以被可視化,除非你會自己製作自定義視圖或委託。可以想象的東西是數字,字符串等。

你要做的是重新使用QTcpSocket作爲只有一些訪問器方法用於返回主機名,端口等的結構。通過濫用這種方式,您不會節省時間。