【问题标题】:PyQt5 QTreeWidget in layout showing an extra column outside the widget布局中的 PyQt5 QTreeWidget 在小部件之外显示一个额外的列
【发布时间】:2020-05-23 22:55:11
【问题描述】:

我正在尝试编写一个 PyQt5 小部件,它将成为应用程序内的基本预设管理器。我正在尝试使用 QTreeWidget 来显示每种类型的结构。我有这个奇怪的问题,我看到一个额外的 QTreeWidget,在我的 QTreeWidget 之外有一列名为“1”。我附上了一张图片(对不起,我无法截屏)和代码。我还注意到,如果我不使用类,则不会发生这种情况。

这是我显示问题的测试代码:

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_())

这就是我所看到的:

任何想法如何让它像第二张图片一样显示,来自一个类?

非常感谢任何帮助

【问题讨论】:

    标签: python user-interface pyqt5 qtreewidget


    【解决方案1】:

    错误很简单:你的窗口(MyTree)是一个空的QTreeWidget,里面有另一个QTreeWidget,所以“1”属于空的QTreeWidget。

    有两种可能的解决方案:

    • 没有用户作为 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)
      

    【讨论】:

    • 两种方法都有效!非常感谢你!我没有注意到使用 QTreeWidget 作为基类正在创建嵌套!
    猜你喜欢
    • 2020-10-16
    • 2021-01-13
    • 2020-06-02
    • 2017-06-23
    • 2020-04-11
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多