2014-07-09 4 views
0

저는 각 부모가 별도의 데이터베이스에있는 QTreeView를 제공하는 여러 SQL 데이터베이스를 처리하기위한 TreeModel을 가상적으로 성공적으로 만들었습니다. ItemTree & ItemModel에는 두 개의 QSqlTableModel 및 사용자 정의 'MAKE DATA'코드에 의해 제공되는 데이터가 없으므로 이벤트 당 ItemTree 인스턴스를 만든 다음 각 이벤트에 대한 하위 항목을 찾고 그 이벤트를 부모로 이벤트로 만듭니다. 항목은 QModelIndexes입니다.두 SQL 데이터베이스의 QTreeView - 작동하지만 업데이트되지 않음

편집 할 때 ItemModel의 setData가 SQL 데이터의 QModelIndex (RealIndex)를 올바르게 찾지 만 모든 항목에 대해 setData (realIndex, v, role = Qt.EditRole)가 실패합니다. setEditStrategy (self.OnFieldChange)를 설정하면 뷰가 원래 데이터로 되돌아갑니다. OnManualSubmit을 사용하면 뷰가 업데이트되지만 모델은 업데이트되지 않습니다. 어떤 아이디어? 감사합니다

#================ EXTERNAL SQL ============== 
class Events(QSqlTableModel): 
    def __init__(self): 
     QSqlTableModel.__init__(self) 

     self.setQuery(QSqlQuery("SELECT * FROM m_events")) 
     self.setEditStrategy(self.OnManualSubmit)  
     self.select()    

events = Events() 
eventsIdIndex = events.record().indexOf("id") 
eventsUseIndex = events.record().indexOf("use") 

class EventChildren(QSqlTableModel): 
    def __init__(self): 
     QSqlTableModel.__init__(self) 

     self.setQuery(QSqlQuery("SELECT * FROM m_event_children")) 
     self.select() 

     self.childEventIndex = self.fieldIndex("event") 
     self.childEventQi = self.createIndex(0, self.childEventIndex) 
     self.childEventOccurrences = 1 

children = EventChildren() 
childrenIdIndex = children.record().indexOf("id") 
childrenEventIndex = children.record().indexOf("event") 
childrenEventQi = children.createIndex(0, childrenEventIndex) 
childrenDescIndex = children.record().indexOf("desc") 

#========== INTERNAL DATA ========== 
#----- TREE ITEMS ----- 
class ItemTree():    
    def __init__(self, data=[], parent=None): 

     self.itemData = data   # the data for each row, as a list of QModelIndexes from the SQL 
     self.itemParent = parent 
     self.itemChildren = [] 

     if parent: 
      self.itemParent.itemChildren.append(self) 

    def child(self, row):     
     return self.itemChildren[row] 

    def childCount(self):        
     return len(self.itemChildren) 

    def row(self): 
     if self.itemParent: 
      return self.itemParent.itemChildren.index(self) 
     return False 

    def columnCount(self): 
     return len(self.itemData) 

    def data(self, index, role=Qt.DisplayRole): 
     return self.itemData[index] 

    def parent(self): 
     return self.itemParent 

#----- VIEWS MODEL ----- 
class ItemModel(QAbstractItemModel): 
    def __init__(self, rootItem=None, parent=None): 
     QAbstractItemModel.__init__(self) 

     self.rootItem = rootItem 

    def rowCount(self, parent=QModelIndex()): 
     if parent.column() > 0: 
      return 0 

     if not parent.isValid(): 
      parentItem = self.rootItem 

     else: parentItem = parent.internalPointer() 

     return parentItem.childCount() 

    def columnCount(self, parent): 
     if parent.isValid(): 
      return parent.internalPointer().columnCount() 
     else: 
      return self.rootItem.columnCount() 

    def index(self, row, column, parent=QModelIndex()): 
     if not parent: 
      return QModelIndex() 

     if not parent.isValid(): 
      parentItem = self.rootItem 
     else: 
      parentItem = parent.internalPointer() 

     childItem = parentItem.child(row) 
     if childItem: 
      return self.createIndex(row, column, childItem) 
     else: 
      return QModelIndex() 

    def parent(self, index=QModelIndex()): 
     if not index.isValid(): 
      return QModelIndex() 

     parentItem = index.internalPointer().parent() 

     if parentItem == self.rootItem: 
      return QModelIndex() 

     return self.createIndex(parentItem.row(), 0, parentItem) 

    def data(self, index, role=Qt.DisplayRole): 
     if not index.isValid(): 
      return QVariant() 
     if role == Qt.DisplayRole or role == Qt.EditRole: 
      col = index.column() 
      return index.internalPointer().itemData[col].data().toString() 
     else: 
      return QVariant() 

    def setData(self, index, v, role=Qt.EditRole): 
     if role == Qt.EditRole: 
      realIndex = index.internalPointer().data(index.column()) 
      realModel = realIndex.model() 

      print v.toString() 
      print realIndex.row() 
      print realIndex.column() 
      print realIndex.model()    
      realModel.setData(realIndex, v, role=Qt.Qt.EditRole) 

      realModel.submit() 
      realModel.submitAll() 
      return True 

    def flags(self, index): 
     if not index.isValid(): 
      return 0 
     else:  
      return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable 

    def headerData(self, section, orientation, role=Qt.DisplayRole): 
     if orientation == Qt.Horizontal and role == Qt.DisplayRole: 
      return self.rootItem.data(section) 
     return QVariant() 

#===== MAKE DATA ===== 
eventsRootItem = ItemTree(data=["ID","Use"]) 

tempEvents = []; finalEvents = [] 
for e in range(events.rowCount()): 
    id = str(events.record(e).value(eventsIdIndex).toString()); tempEvents.append("event"+id); finalEvents.append("event"+id) 
    idQi = events.createIndex(e, eventsIdIndex, events) 
    useQi = events.createIndex(e, eventsUseIndex, events) 

    for i in range(len(tempEvents)): 
     tempEvents[i] = ItemTree(data=[idQi, useQi], parent=eventsRootItem) 
     finalEvents[i] = tempEvents[i] 
     del tempEvents[0] 

for e in eventsRootItem.itemChildren: 
    eventId = e.itemData[0].data().toString() # 0 here relates to the first item in the event data, which is the events id index 
    eventsChildrenEventIds = children.match(childrenEventQi, Qt.DisplayRole, eventId, -1) 
    for c in eventsChildrenEventIds: 
     row = c.row() 
     idQi = children.createIndex(row, childrenIdIndex, children) 
     eventQi = children.createIndex(row, childrenEventIndex, children) 
     descQi = children.createIndex(row, childrenDescIndex, children) 
     t = ItemTree(data=[idQi, descQi], parent=e) 

#----- RUN ----- 
eventsModel = ItemModel(rootItem=eventsRootItem)  
view = QTreeView() 
view.setModel(eventsModel) 
sys.exit(appl.exec_()) 

답변

0

해결되었습니다. QSqlTableModel이 사용자 지정 쿼리를 사용했기 때문에 데이터베이스가 설정되지 않았습니다. setData가 호출되면 QSqlTableModel에 쓸 곳이 없습니다. 변경 대상 :

self.setTable("talbe_name") 
self.select() 

또한 QSqlTableModel의 제한 사항 인 setFilter & 정렬을 해결할 수 없습니다. 별도의 QSqlTableModels &으로 쿼리를 분할하여 Qts의 다른 기능을 사용하여 적절한 데이터를 표시하거나 사용자 정의 QSqlTableModel을 사용하여 몇 가지 가능한 옵션을 사용할 수 있습니다. 감사의 말씀