Как достать индекс выбранного элемента в QTreeWidget?
Как достать индекс выбранного элемента в treeWidget?
В данном случае индекс должен быть "1".
Пробовал:
self.treeWidget.selectedIndexes()[0], self.treeWidget.currentIndex()
пока не получается
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QMainWindow
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.add_item)
self.pushButton_2.clicked.connect(self.delete)
self.count = 0
def add_item(self):
item = QTreeWidgetItem()
item.setText(0, "Hello")
item.setText(1, "world")
item.setText(2, '2021')
self.treeWidget.addTopLevelItem(item)
self.count += 1
def delete(self):
self.treeWidget.removeItemWidget(self.treeWidget.currentItem(), 0)
self.treeWidget.removeItemWidget(self.treeWidget.currentItem(), 1)
self.treeWidget.removeItemWidget(self.treeWidget.currentItem(), 2)
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.treeWidget = QtWidgets.QTreeWidget(Dialog)
self.treeWidget.setGeometry(QtCore.QRect(20, 40, 256, 192))
self.treeWidget.setObjectName("treeWidget")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(300, 80, 75, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(Dialog)
self.pushButton_2.setGeometry(QtCore.QRect(300, 120, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.treeWidget.headerItem().setText(0, _translate("Dialog", "1"))
self.treeWidget.headerItem().setText(1, _translate("Dialog", "2"))
self.treeWidget.headerItem().setText(2, _translate("Dialog", "3"))
self.pushButton.setText(_translate("Dialog", "Добавить"))
self.pushButton_2.setText(_translate("Dialog", "Удалить"))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
Не изменяйте код, сгенерированный Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
QTreeWidgetItem *QTreeWidget::invisibleRootItem() const
Возвращает невидимый корневой элемент виджета-дерева.
Невидимый корневой элемент обеспечивает доступ к элементам верхнего уровня виджета-дерева через QTreeWidgetItem API, что позволяет писать функции, которые могут обрабатывать элементы верхнего уровня и их дочерние элементы единообразно; например, рекурсивные функции.
QTreeWidgetItem *QTreeWidgetItem::takeChild(int index)
Удаляет список потомков и возвращает его, в противном случае возвращает пустой список.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.treeWidget = QtWidgets.QTreeWidget(Dialog)
self.treeWidget.setGeometry(QtCore.QRect(20, 40, 256, 192))
self.treeWidget.setObjectName("treeWidget")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(300, 80, 75, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(Dialog)
self.pushButton_2.setGeometry(QtCore.QRect(300, 120, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.treeWidget.headerItem().setText(0, _translate("Dialog", "1"))
self.treeWidget.headerItem().setText(1, _translate("Dialog", "2"))
self.treeWidget.headerItem().setText(2, _translate("Dialog", "3"))
self.pushButton.setText(_translate("Dialog", "Добавить"))
self.pushButton_2.setText(_translate("Dialog", "Удалить"))
#class MainWindow(QMainWindow): # --- QMainWindow
class MainWindow(QDialog, Ui_Dialog): # +++ QDialog
def __init__(self):
super().__init__()
self.setupUi(self)
headers = ['A','B','C',] # +++
self.treeWidget.setColumnCount(len(headers)) # +++
self.treeWidget.setHeaderLabels(headers) # +++
self.pushButton.clicked.connect(self.add_item)
self.pushButton_2.clicked.connect(self._delete)
self.count = 0
def add_item(self):
item = QTreeWidgetItem()
item.setText(0, f"Hello {self.count}")
item.setText(1, "world")
item.setText(2, '2021')
# void QTreeWidget::addTopLevelItems(const QList<QTreeWidgetItem *> &items)
# Добавляет список элементов как элементы верхнего уровня в виджете.
self.treeWidget.addTopLevelItem(item)
self.count += 1
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def _delete(self):
print(f'\ninvisibleRootItem = {QTreeWidget.invisibleRootItem(self.treeWidget)}')
print(f'row = {self.treeWidget.currentIndex().row()}')
item = QTreeWidget.invisibleRootItem(self.treeWidget).takeChild(
self.treeWidget.currentIndex().row())
print(f'item = {item}')
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

