2013-11-04 73 views
0

更新針對這一問題是在以下兩個問題升級:Qt的模型視圖,對鬆散耦合的模型和數據

這裏的情況是:

enter image description here

MODEL有一個指向SERVER的指針(SERVER代表Data),通過它指定所需的數據並將它們格式化爲QStrings,以便VIEW可以理解它們。該模型不保留QList的內部副本,它直接訪問它並將中的QStrings轉換爲QVariant QAbstractItemModel::data方法。

但是,如果建立了與SERVER的新連接,則無需模型或視圖就可以更改套接字列表。在這種情況下,另一個QTcpSOcket *被附加到SERVER QList。

如何通知模型/數據更改的視圖?

  • 從每個新連接上的SERVER調用QAbstractItemModel::reset()。我認爲這不好,因爲它需要修改SERVER以滿足MODEL的需要,在這種情況下,我可以將MODEL和SERVER作爲一個單獨的實體。

  • connect(&server, QTcpServer::newConnection, &model, &StationListModel::reset)嘗試通過信號和插槽連接SERVER和MODEL。但是,&StationListModel::reset不是一個插槽,所以我認爲這不是正確的方法。

我想聽聽哪種方法(如果有的話)在給定的情況下被認爲是適當的。而且是堅持MODEL-SERVER鬆耦合一個糟糕的設計選擇?

回答

1

下面是應該怎麼做:

  1. 創建服務器通知有關數據變化的信號(或者使用已有的QTcpServer::newConnection信號是否就足夠了)。
  2. 在您的模型類中創建一個或多個插槽,並將SERVER的信號連接到此插槽。
  3. 在插槽的實現中,發送信號或調用內部方法(例如beginInsertRowsendInsertRows)或者只是重置模型以通知視圖有關新更改。
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) 
0

我知道這是一個老問題,但我想分享我在處理完全相同的問題時所做的工作。 如果您將服務器指針放入模型實施中,並且您從QList< QTcpSocket *>獲取所有型號信息,請使用此連接:

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