PyQt5 QTreeWidget в макете, показывающий дополнительный столбец вне виджета

Я пытаюсь написать виджет PyQt5, который будет основным менеджером предустановок внутри приложения. Я пытаюсь использовать QTreeWidget для отображения структуры каждого типа. У меня есть эта странная проблема, когда я вижу дополнительный QTreeWidget со столбцом с именем «1» за пределами моего QTreeWidget. Прикрепил картинку (извините, скриншоты сделать не удалось) и код. Я также заметил, что этого не происходит, если я не использую классы.

Вот мой тестовый код, показывающий проблему:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class MyTree(QtWidgets.QTreeWidget):
    def __init__(self, parent = None):
        super(self.__class__, self).__init__(parent)

        boxLayout = QtWidgets.QVBoxLayout()

        treeWidget = QtWidgets.QTreeWidget()
        treeWidget.setHeaderLabels(['Preset Name'])
        treeWidget.setColumnCount(1)
        items = []
        for i in range(10):
            items.append(QtWidgets.QTreeWidgetItem(["item {0}".format(i)]))
        treeWidget.insertTopLevelItems(0, items)

        boxLayout.addWidget(treeWidget)
        self.setLayout(boxLayout)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    w = MyTree()
    w.show()

    sys.exit(app.exec_())

Вот что я вижу:

Я предполагаю, что это вызвано макетом, потому что если я просто создам QTreeWidget следующим образом:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

app = QtWidgets.QApplication(sys.argv)

treeWidget = QtWidgets.QTreeWidget()
treeWidget.setHeaderLabels(['Preset Name'])
treeWidget.setColumnCount(1)
items = []
for i in range(10):
    items.append(QtWidgets.QTreeWidgetItem(["item {0}".format(i)]))
treeWidget.insertTopLevelItems(0, items)
treeWidget.show()

sys.exit(app.exec_())

Вот что я вижу:

Есть идеи, как сделать так, чтобы он отображался как второе изображение из класса?

Любая помощь приветствуется


person vaco    schedule 23.05.2020    source источник


Ответы (1)


Ошибка проста: ваше окно (MyTree) представляет собой пустой виджет QTreeWidget, внутри которого находится другой виджет QTreeWidget, поэтому «1» принадлежит пустому виджету QTreeWidget.

Есть 2 возможных решения:

  • Нет пользователя в качестве базового класса для QTreeWidget

    class MyTree(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(self.__class__, self).__init__(parent)
    
            treeWidget = QtWidgets.QTreeWidget()
            treeWidget.setHeaderLabels(["Preset Name"])
            treeWidget.setColumnCount(1)
            items = []
            for i in range(10):
                items.append(QtWidgets.QTreeWidgetItem(["item {0}".format(i)]))
            treeWidget.insertTopLevelItems(0, items)
    
            boxLayout = QtWidgets.QVBoxLayout(self)
            boxLayout.addWidget(treeWidget)
    
  • Не вкладывайте новый QTreeWidget

    class MyTree(QtWidgets.QTreeWidget):
        def __init__(self, parent=None):
            super(self.__class__, self).__init__(parent)
    
            self.setHeaderLabels(["Preset Name"])
            self.setColumnCount(1)
            items = []
            for i in range(10):
                items.append(QtWidgets.QTreeWidgetItem(["item {0}".format(i)]))
            self.insertTopLevelItems(0, items)
    
person eyllanesc    schedule 23.05.2020
comment
Оба метода работают! Большое спасибо! Я не заметил, что использование QTreeWidget в качестве базового класса создавало вложение! - person vaco; 24.05.2020