2016-04-22 50 views
-1

我想知道實現QML以下事實的最好方法之間共享一個模型的項目:如何在QML ListView和網格

我有一個的ListView用投擲的元素和網格初始填充DropArea。 ListView使用從QAbstractItemModel派生的模型。我想在網格上放置一個元素並與之交互(例如重命名它)。目前,ListView中的任何修改都會更新模型,但網格中元素的修改如何更新模型?

網格中可能有多個項目與ListView模型的一個子集相對應。我不知道我怎麼能做到這一點。 不能使用,因爲網格不是GridView,而且必須在特定位置移動/設置項目。於是,我就:

  • 上創建放置項目顯示,使用相同的模型來將項目源的ListView一個ListView,
  • 設置相同rootIndex,那麼同樣的指數

我接近解決方案,但我認爲這不是最好的方法來做到這一點。

任何線索?

由於

+0

模型的物品或視圖的物品?數據部分還是視覺部分? – dtech

+0

我想在ListView和Grid中的組件中有相同模型項的不同視覺表示。因此,ListView中項目的修改應更新網格中的項目,反之亦然。 –

回答

0

我終於找到了一個解決方案,通過創建一個從QObject繼承的C++類型,它可以嵌入到QML對象中。此類型具有讀/寫屬性,並使用與ListView相同的模型進行初始化。有趣的方法是:

/* writing to a property **from QML** goes here */ 
void ModelItem::setName(const QString& name) 
{ 
    setModelData(GroupMemberModel::Nom, name); 
} 
/* then here */ 
bool ModelItem::setModelData(GroupMemberModel::Role role, const QVariant& value) 
{ 
    return m_model->setData(m_modelIndex, value, role); 
} 

/* any changes in the model fall here (signals/slots mecanism)*/ 
void ModelItem::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>& roles) 
{ 
    if(m_modelIndex.row() < topLeft.row() || m_modelIndex.row() > bottomRight.row()) 
     return; 
    if(m_modelIndex.column() < topLeft.column() || m_modelIndex.column() > bottomRight.column()) 
     return; 
    //Index is modified, emit signal 
    foreach(int role, roles) { 
     emitDataChanged(role); 
    } 
} 
/* **notify QML** by emit signal on property */ 
void ModelItem::emitDataChanged(int role) const 
{ 
    if(role < (Qt::UserRole+1)) 
     role+=Qt::UserRole+1; 

    switch(role) 
    { 
    case GroupMemberModel::Nom: 
     emit nameChanged(); 
     break; 
    default: 
     qDebug() << "ModelItem::dataChanged, unknown role"; 
     break; 
    } 
} 

這工作的需要,比我想的簡單。

0

我想具有相同的模型 項的不同視覺表示在ListView和在網格的成分。因此,修改 ListView中的項目應更新網格中的項目,反之亦然 。

如果您的模型數據不是由NOTIFY和屬性導出的QObject,則只能通過模型​​通知更改。

而且由於您不會使用網格模型,這意味着您的模型必須使用底層的QObject實例。 A generic model object可能派上用場。

如果你有,你只需要引用底層QObject模型項目,並使用綁定來設置你的列表視圖委託。然後,當您拖放時,您只需將對QObject的引用傳遞給您將在網格內創建的其他視覺表示。

最後,在從模型中刪除項目時請注意不要留下懸掛引用,因爲這很可能會嚴重地導致應用程序崩潰。隨着模型項目對象被銷燬,使用附加信號onDestruction清除網格中的元素。

+0

謝謝,我要去看這個。我還會仔細看一下Package元素,因爲放在網格上的元素承載一個View。 –