LINUX.ORG.RU

QTreeView + Таблица БД, есть вопрос


0

0

Здравствуйте, у меня есть вопрос. Допустим есть такая таблица:
Код
mysql> select * from EnumerateGroups;
+----+---------+------------------+-----------+-------------+
| id | Root_id | name | aliasname | description |
+----+---------+------------------+-----------+-------------+
| 1 | 0 | parent_one | NULL | NULL |
| 2 | 0 | parent_two | NULL | NULL |
| 3 | 1 | child_one1 | NULL | NULL |
| 4 | 1 | child_one2 | NULL | NULL |
| 5 | 0 | parent_three | NULL | NULL |
| 6 | 5 | child_three1 | NULL | NULL |
| 7 | 4 | child_for_child1 | NULL | NULL |
| 8 | 4 | child_for_child2 | NULL | NULL |
+----+---------+------------------+-----------+-------------+


Нужно создать TreeView в котором отображалось бы что-то вроде:
Код
- parent_one
|--- child_one1
|--- child_one2
|------ child_for_child1
|------ child_for_child2
- parent_two
- parent_three
|--- child_three1


Ну то что мне на голову приходит это(на Питоне):
Код
def findItem(ident, model):
numRows = model.rowCount()
for row in xrange(numRows):
if int(model.index(row, 0).data().toString()) == ident:
return model.index(row, 0)
return None

self.tree = MyTreeView(self)
self.tree.setColumnCount(3)
data = QtSql.QSqlQuery("SELECT id, Root_id, name FROM EnumerateGroups", self.db)

while data.next():
parent = findItem(int(data.value(1).toString()), self.tree.model())
if parent != None:
item = QtGui.QTreeWidgetItem(self.tree.itemFromIndex(parent))
else:
item = QtGui.QTreeWidgetItem(self.tree)

item.setText(0, data.value(0).toString())
item.setText(1, data.value(1).toString())
item.setText(2, data.value(2).toString())


И этот код работает, но только если количество уровней не более 2х. Он бы и работал при любом количестве уровней если бы model.index(Х, 0) перемещалось не только по родителям но и по потомкам. Может кто подскажет как лучше сделать?

Хм... и как сдесь код на питоне писать :/
'def findItem(ident, model):
' numRows = model.rowCount()
' for row in xrange(numRows):
' if int(model.index(row, 0).data().toString()) == ident:
' return model.index(row, 0)
' return None

'self.tree = MyTreeView(self)
'self.tree.setColumnCount(3)
'data = QtSql.QSqlQuery("SELECT id, Root_id, name FROM EnumerateGroups", self.db)

'while data.next():
' parent = findItem(int(data.value(1).toString()), self.tree.model())
' if parent != None:
' item = QtGui.QTreeWidgetItem(self.tree.itemFromIndex(parent))
' else:
' item = QtGui.QTreeWidgetItem(self.tree)

' item.setText(0, data.value(0).toString())
' item.setText(1, data.value(1).toString())
' item.setText(2, data.value(2).toString())

anterior
() автор топика

Обход дерева в прямом порядке (preorder)
Ни на петоне, ни в Qt не программирую. Это только набросок:

def preorder(parent_item, parent_id):
	data=QtSql.QSqlQuery("SELECT id, Root_id, name FROM EnumerateGroups WHERE Root_id=?", self.db, parent_id)
	for i in data:
		item = QtGui.QTreeWidgetItem(parent_item)
		item.setText(0, i[0])
		item.setText(1, i[1])
		item.setText(2, i[2])
		
		preorder(item, i[0])
		
preorder(self.tree, 0)

Dr_ZLO
()
Ответ на: комментарий от Dr_ZLO

Спасибо, помогло. И почему я раньше до этого не догадался...

anterior
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.