Как добавить строку в 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)
Автор решения: 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_())


