2011-11-03 3 views
0

서브 클래스 된 DomModel : QAbstractItemModel을 설정 한 QTreeView가 있습니다. 각 항목은 주로 QDomNode를 다루는 DomItem입니다. QDomDocument를이 모델로 설정했습니다. Qt 예제 중 하나에서이 시스템을 파생시킨 것 같습니다.Qt QTreeView 편집 가능한 DOM 모델

노드 이름은 0, 속성은 1, 값은 2입니다.

어쨌든이 XML DOM 트리를 편집 가능하게 만들고 싶습니다. Qt :: ItemIsEditable 및 일부 다른 것들을 모델 클래스에서 수정 했으므로 두 번 클릭하여 QTreeView를 통해 모델을 편집 할 수 있습니다.

2 열의 경우 QDomItem에 setNodeValue 함수가 있기 때문에 쉽습니다. 그러나 item-> node(). NodeName() 및 item-> node() 속성에 대한 "설정") 그러면 0과 1 열을 수정할 수 있습니다.

이제 열 2를 수정하면 열 0과 1이 Enter 키를 누르면 이전 값으로 되돌아갑니다. QDomElement을 반환 분명히 item->node().toElement()

bool DomModel::setData(const QModelIndex &index, const QVariant &value, 
        int role) 
{ 
if (role != Qt::EditRole) return false; 

DomItem *item = static_cast<DomItem*>(index.internalPointer()); 

switch (index.column()){ 
    case 0: 
     // ??? 
     break; 
    case 1: 
     // ??? 
     break; 
    case 2: 
     item->node().setNodeValue(value.toString()); // This works - QTreeView is updated 
     break; 
} 
... 
} 

답변

3

음, 필요한 "set"기능을 가지고 있으며, 그것은 작동합니다. 그래서 내 XML DOM 파일을 QTreeView으로 완전히 수정하는 방법을 찾은 것 같습니다.

이 나를 위해 트릭을 수행합니다

switch (index.column()){ 
    case 0: // added 
     item->node().toElement().setTagName(value.toString()); 
     break; 
    case 1: // added 
     // this shall be modified to account for nonstandard spacings, etc. 
     aux = value.toString().trimmed(); 
     aux.remove("\""); 
     attributes.clear(); 
     attributes = aux.split(" "); 
     for(int i = 0; i<attributes.size(); i++){ 
     item->node().toElement().setAttribute(attributes.at(i).split("=").at(0), 
               attributes.at(i).split("=").at(1)); 
     } 
     break; 
    case 2: // Left it as it is 
     item->node().setNodeValue(value.toString()); // This works - QTreeView is updated 
     break; 
}