0

这个问题是对以下两个问题的升级:

情况如下:

在此处输入图像描述

MODEL 有一个指向 SERVER 的指针(SERVER 代表Data),通过它获取所需的数据并将它们格式化为QStrings,以便 VIEW 可以理解它们。该模型不保留 的内部副本QList,它直接访问它并将 requ 转换QTcpSocket *QStrings方法中的QVariant QAbstractItemModel::data

但是,如果建立了与 SERVER 的新连接,则套接字列表可能会在模型或视图不知道的情况下更改。在这种情况下,另一个QTcpSOcket *附加到 SERVERs QList。

如何通知视图模型/数据更改?

  • QAbstractItemModel::reset()在每个新连接上从 SERVER调用。我认为这很糟糕,因为它需要根据模型的需要修改服务器,在这种情况下,我可以将模型和服务器作为一个实体。

  • connect(&server, QTcpServer::newConnection, &model, &StationListModel::reset) 尝试通过 Signals 和 Slots 连接 SERVER 和 MODEL。但是,&StationListModel::resetISN 不是插槽,所以我认为这不是正确的方法。

我想听听在给定的情况下,哪些方法(如果有的话)被认为是合适的。坚持 MODEL-SERVER 松耦合是一个糟糕的设计选择吗?

4

3 回答 3

1

这是应该如何完成的:

  1. 在 SERVER 中创建通知数据更改的信号(QTcpServer::newConnection如果足够,则使用现有信号)。
  2. 在模型类中创建一个插槽(或多个插槽)并将 SERVER 的信号连接到此插槽。
  3. 在插槽的实现中发出信号或调用内部方法(例如beginInsertRows, endInsertRows)或只是重置模型以通知视图有关新的更改。
于 2013-11-04T10:29:59.753 回答
0

我知道这是一个老问题,但我想分享我在处理完全相同的问题时所做的事情。如果您将服务器指针放入模型实现中,并从QList< QTcpSocket *>使用此连接中获取所有模型信息:

connect(server, SIGNAL(newConnection()), this, SIGNAL(modelReset()));
于 2014-11-12T14:41:22.513 回答
0

由于您需要逐步将新项目附加到您的视图中,因此我将通过以下方式执行此操作:

在您的模型类中

// A slot
void MyModel::onNewConnection()
{
    // Append new socket to the list QList<QTcpSocket *>
    m_socketList.puch_back(new QTcpSocket);
    // Update the model.
    insertRow(0);
}

// Virtual function
bool MyModel::insertRows(int row, int count, const QModelIndex &parent)
{
    if (!parent.isValid()) {
        // We need to append a row to the bottom of the view.
        int rows = rowCount() - 1;

        beginInsertRows(parent, rows, rows);
        // Do nothing, but just inform view(s) that the internal data has changed
        // and these rows should be added.
        endInsertRows();
        return true;
    }
    return QAbstractItemModel::insertRows(row, count, parent);
}

在您的代码中的某处

[..]
connect(&server, QTcpServer::newConnection, &model, &StationListModel::onNewConnection)
于 2013-11-04T11:32:40.687 回答