0

我试图了解模型和数据之间的关系应该是什么。

在此处输入图像描述


对于我目前的情况,我有一个 QTcpServer ,它保留了一个活动套接字列表。

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

模型应该向视图表示的数据是QList<QTcpSocket *> m_activeSockets;

我觉得正确的做法是不惜一切代价防止数据重复,因为这可能导致不一致。这意味着任何时候 View 都应该代表真实状态的数据。

我尝试了一些方法,但没有成功,因为我可以花时间测试每种方法的时间有限。

方法:

1.

TftpServer::m_activeSockets私有的,Model 通过 getter 和 setter 访问它。

  • 缺陷:如何从TftpServer::m_activeSockets模型内部调用方法?

2.

模特朋友班TftpServer。直接访问TftpServer::m_activeSockets.

  • 未能实施。

3.

TftpServer::m_activeSockets上市。模型具有公共参考

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

  • 缺陷:敏感数据公开

我想找出一个最佳解决方案(随时提出建议)被认为是最佳的。

并听听他们是否是不坚持使用单个数据源的优点(在这种情况下,模型将只有一个副本TftpServer::m_activeSockets作为其参数并在更改时与它同步)。

4

1 回答 1

1

您正在滥用 Qt 的模型视图架构 - 无需传递实际的套接字。您想要的是对连接列表进行建模,因此只需实现它即可。连接有一些参数——这些参数可以映射到模型的列,或者作为子行,每个连接都是树中的父项,这取决于更方便的方式。模型应该提供的数据必须在可视化方面有意义。除非您要制作自己的自定义视图或委托,否则AQTcpSocket没有什么可以可视化的。可以可视化的东西是数字、字符串等。

您要做的是QTcpSocket仅将结构重新用作具有一些用于返回主机名、端口等的访问器方法的结构。以这种方式滥用它不会节省任何时间。

于 2013-10-31T21:06:48.610 回答