Как добавить строку в QTreeWidget по нажатию кнопки

Подскажите, пожалуйста, как добавить строку по нажатию pushButton в виджете QTreeWidget, как на скриншоте

main.py

import  sys
from PyQt5 import QtCore, QtGui, QtWidgets
from ui import *
class MyWin(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.add_table_item)

    def add_table_item(self):
        pass


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    myapp.setWindowTitle("Vk BOT")
    sys.exit(app.exec_())

ui.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(603, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
        self.treeWidget.setObjectName("treeWidget")
        self.verticalLayout.addWidget(self.treeWidget)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))

Должно получиться вот так.

введите сюда описание изображения

Update

Как добавить из main еще строку. Я не очень понял.

self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "С0ЭЛ0"))
        self.treeWidget.topLevelItem(0).setText(1, _translate("MainWindow", "С1ЭЛ1"))
        self.treeWidget.topLevelItem(0).setText(2, _translate("MainWindow", "С2ЭЛ2"))
        self.treeWidget.topLevelItem(0).setText(3, _translate("MainWindow", "С3ЭЛ3"))
        self.treeWidget.topLevelItem(0).setText(4, _translate("MainWindow", "С4ЭЛ4"))
        self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "Д0С0ЭЛ0"))
        self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("MainWindow", "Д1С1ЭЛ1"))
        self.treeWidget.topLevelItem(0).child(0).setText(2, _translate("MainWindow", "Д2С2ЭЛ2"))
        self.treeWidget.topLevelItem(0).child(0).setText(3, _translate("MainWindow", "Д3С3ЭЛ3"))
        self.treeWidget.topLevelItem(0).child(0).setText(4, _translate("MainWindow", "Д4С4ЭЛ4"))

Ответы (2 шт):

Автор решения: Maxim Timakov

Вам нужен метод QTreeWidget::addTopLevelItem

Заголовки столбцов можно установить методом QTreeWidget::setHeaderLabels

При нажатии на кнопку создаете и заполняете QTreeWidgetItem

Пример добавления

# -*- coding: utf-8 -*-
import sys
from typing import List

from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, \
    QMainWindow, QWidget, \
    QTreeWidget, QTreeWidgetItem, \
    QPushButton, QVBoxLayout


class MainView:
    def __init__(self, window: QMainWindow):
        self.__build_ui(window)

    def __build_ui(self, window: QMainWindow):
        container = QWidget()
        box = QVBoxLayout()

        self.tree = QTreeWidget()
        self.tree.setHeaderLabels([f"column #{idx}" for idx in range(5)])
        self.add_btn = QPushButton("press me")

        box.addWidget(self.tree)
        box.addWidget(self.add_btn)

        container.setLayout(box)
        window.setCentralWidget(container)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__(parent=None)
        self.ui = MainView(self)
        self.ui.add_btn.clicked.connect(self.__add_btn_clicked)

    def __add_btn_clicked(self):
        idx = self.ui.tree.topLevelItemCount()
        cnt = self.ui.tree.columnCount()

        item = QTreeWidgetItem()
        for c in range(cnt):
            item.setText(c, f"item {idx}/{c}")

        item.setCheckState(cnt-1, Qt.Checked)

        self.ui.tree.addTopLevelItem(item)


def main(argv: List[str]) -> int:
    app = QApplication(argv)

    view = MainWindow()
    view.show()

    return app.exec_()


if __name__ == '__main__':
    exit_code = main(sys.argv)
    sys.exit(exit_code)

treewidget pyside2

→ Ссылка
Автор решения: S. Nick

Попробуйте так:

import  sys
from PyQt5 import QtCore, QtGui, QtWidgets

#from ui import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(603, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
        self.treeWidget.setObjectName("treeWidget")
        self.verticalLayout.addWidget(self.treeWidget)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        

class MyWin(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
#        self.ui = Ui_MainWindow()
        self.setupUi(self)
        self.rows = 0
        
        # задайте числа столбцов:
        self.treeWidget.setColumnCount(5)
        # Установите заголовок каждого столбца:
        self.treeWidget.setHeaderLabels(['столбец0', 'столбец1', 'столбец2', 'столбец3', 'столбец4'])
        # При щелчке любого элемента в QTreeWidget срабатывает сигнал itemClicked
        self.treeWidget.itemClicked.connect(self.change_func)

        self.preview = QtWidgets.QTreeWidgetItem(self.treeWidget) 
        self.treeWidget.addTopLevelItem(self.preview)
        self.preview.setText(0, 'С0Эл0')
        self.preview.setText(1, 'test1')
        self.preview.setText(2, 'test2')
        self.preview.setText(3, 'test3')
        self.preview.setText(4, 'test4')
        self.preview.setCheckState(4, QtCore.Qt.Unchecked)
        
        self.preview.addChild(QtWidgets.QTreeWidgetItem(['item1']))
        
        # Вызвать метод expandAll(), чтобы открыть все элементы в QTreeWidget.        
        self.treeWidget.expandAll()        

        # связываем сигнал itemClicked с пользовательской функцией слота.
        # При щелчке любого элемента в QTreeWidget срабатывает сигнал itemClicked.        
        self.pushButton.clicked.connect(self.add_table_item)

    def add_table_item(self):                   
        self.rows += 1
        
        self.preview = QtWidgets.QTreeWidgetItem(self.treeWidget) #, ['Треугольник раскрытия информации']) 
        self.treeWidget.addTopLevelItem(self.preview)
        self.preview.setText(0, f'С0Эл {self.rows}:0')
        self.preview.setText(1, f'test {self.rows}:1')
        self.preview.setText(2, f'test {self.rows}:2')
        self.preview.setText(3, f'test {self.rows}:3')
        self.preview.setText(4, f'test {self.rows}:4')
        self.preview.setCheckState(4, QtCore.Qt.Unchecked)
        self.treeWidget.expandAll()         

    def change_func(self, item, column):
        print(column, item.text(column))
       

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    myapp.setWindowTitle("Vk BOT")
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка