使用 Sqlite 和 PyQT5 制作 TreeView

Make a TreeView with Sqlite and PyQT5

当我向我的 SQLite 数据库添加项目时,我试图在 QTreeWidget 中添加项目。我的问题是我想将项目作为 child 添加到给定的其他项目中。让我在代码中向您展示它。这是我的 Gui 示例:

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(213, 327)
        Form.setWindowTitle("Form")
        self.treeWidget = QtWidgets.QTreeWidget(Form)
        self.treeWidget.setGeometry(QtCore.QRect(0, 10, 211, 311))
        self.treeWidget.setObjectName("treeWidget")
        self.treeWidget.headerItem().setText(0, "Categories")
        self.treeWidget.setSortingEnabled(False)
        self.printtree()
        QtCore.QMetaObject.connectSlotsByName(Form)

    def printtree(self):
        rn = readsql_Names()
        self.treeWidget.setColumnCount(1)
        treeItem = QtWidgets.QTreeWidgetItem([rn])
        self.treeWidget.addTopLevelItem(treeItem)


        def displaytree():
            conn = connect_DB() # Connection to the Database 
            cursor = conn.cursor()
            table = cursor.execute(f"SELECT NAME FROM Test")
            for item in table.fetchall():
                name = str(item[0])
                branch_list = QtWidgets.QTreeWidgetItem([name])
                treeItem.addChild(branch_list)
                # I guess here should be a if statement.
                branch_list.addChild(QtWidgets.QTreeWidgetItem(["name"]))
        displaytree()

这就是我的 SQLite 的样子:

def create_testsql(Tree_Table="Test"):
    conn = connect_DB()
    cursor = conn.cursor()
    try:
        cursor.execute(f"CREATE TABLE IF NOT EXISTS {Tree_Table} \
            (ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \
            PARENTID INTEGER, \
            NAME TEXT NOT NULL)")
        conn.commit()
    except:
        print("Failure! Creating the TEST Table has failed.")

所以我想检查 Parent Id = ID 那么它应该在 QTreeView 中显示为 child。我必须以某种方式更改 printtree 函数,但我不知道如何更改。

当我在 ParentID = item2 的 ID 时添加 item4 时它应该是什么样子。

我的树视图示例

正如@musicamante 所说,在单个 for 循环中是不可能的。所以我创建了一个 General table,其中 Item_Table 中的 Item_ID 和 Tree_Table 中的 Tree_ID 被引用为外键并获得了一个 ID,它是独特。然后我 运行 General table 中的一个 for 循环和一个 if else 语句将它们排序为:

if item_id == "null":
  treeWidget.addTopLevelItem
else:
  addChild