Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt模型视图,松耦合模型和数据的更新视图_Qt_Model View Controller_Model - Fatal编程技术网

Qt模型视图,松耦合模型和数据的更新视图

Qt模型视图,松耦合模型和数据的更新视图,qt,model-view-controller,model,Qt,Model View Controller,Model,此问题是对以下两个问题的升级: 情况如下: 模型有一个指向服务器(服务器表示)的指针,通过它可以获取所需的数据并将其格式化为QStrings,以便视图能够理解它们。模型不保留QList的内部副本,它直接访问它,并在QVariant qabstractemmodel::data方法中将requqtcsocket*转换为QStrings 但是,如果与服务器建立了新连接,套接字列表可能会在模型或视图不知道的情况下更改。在这种情况下,另一个qtcsocket*将附加到服务器QList 如何通知

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

情况如下:

模型有一个指向服务器(服务器表示)的指针,通过它可以获取所需的数据并将其格式化为
QStrings
,以便视图能够理解它们。模型不保留
QList
的内部副本,它直接访问它,并在
QVariant qabstractemmodel::data
方法中将requ
qtcsocket*
转换为
QStrings

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

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

  • 在每个新连接上从服务器调用
    qabstractemmodel::reset()
    。我认为这是坏的,因为它需要修改服务器的模型的需要,在这种情况下,我可以只是模型和服务器作为一个单一的实体。

  • 连接(&server,qtcserver::newConnection,&model,&StationListModel::reset)
    尝试通过信号和插槽连接服务器和模型。但是,
    &StationListModel::reset
    不是插槽,因此我认为这不是正确的方法


我想听听上述哪种方法(如果有的话)在特定情况下被认为是合适的。坚持模型服务器松散耦合是一个糟糕的设计选择吗

以下是应该如何做:

  • 在服务器中创建通知数据更改的信号(或者使用现有的
    qtcserver::newConnection
    signal,如果足够的话)
  • 在模型类中创建一个或多个插槽,并将服务器的信号连接到此插槽
  • 在插槽的实现中,发出信号或调用内部方法(例如,
    beginInsertRows
    endInsertRows
    ),或仅重置模型以通知视图新的更改

  • 由于您需要以增量方式将新项附加到视图中,因此我将按以下方式执行此操作:

    在你的模型课上

    // 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);
    }
    

    我知道这是一个老生常谈的问题,但我想与大家分享我在处理同一问题时所做的工作。 如果将服务器指针放入模型实现中,并且从
    QList
    获取所有模型信息,请使用此连接:

    connect(server, SIGNAL(newConnection()), this, SIGNAL(modelReset()));
    
    connect(server, SIGNAL(newConnection()), this, SIGNAL(modelReset()));