2013-10-31 19 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作为只有一些访问器方法用于返回主机名,端口等的结构。通过滥用这种方式,您不会节省时间。