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
方法中将requqtcsocket*
转换为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()));