저는 각 부모가 별도의 데이터베이스에있는 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_())