增加qtreewidget的大小

问题描述

在PyQT5中为Qtreewidget发出信号对我来说是一个问题。单击“增加”时,需要增加QTreeWidget的大小,然后再次单击时(如Excel中的过滤器),减小QTreeWidget的大小

代码

 self.tree_countries.setGeometry(QRect(1050,100,200,250))
 self.tree_countries.setHeaderHidden(True)
 self.tree_countries.setStyleSheet("QTreeWidget {\n"
                                   "border: 1px solid #3b3838;\n"
                                   "font: 57 12pt \"Google Sans Medium\";\n"
                                   "color: white;\n"
                                   "background-color: #3b3838\n"
                                   "}\n")
 sql = filter_sql()
 parent = QTreeWidgetItem(self.tree_countries)
 parent.setText(0,"Страна")
 parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
 for country in sql.all_countries():
     country = str(country)
     child = QTreeWidgetItem(parent)
     child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
     child.setText(0,country[2:-3])
     child.setCheckState(0,Qt.Unchecked)
 self.tree_countries.show()

解决方法

如果要根据子项是展开还是折叠来更改QTreeWidget的高度,则必须使用展开和折叠信号。您还必须计算所需的高度。

from PyQt5 import QtCore,QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.tree = QtWidgets.QTreeWidget()
        self.tree.header().hide()

        root_item = QtWidgets.QTreeWidgetItem(self.tree)
        root_item.setText(0,"root")
        root_item.setFlags(
            root_item.flags() | QtCore.Qt.ItemIsTristate | QtCore.Qt.ItemIsUserCheckable
        )

        for i in range(10):
            child = QtWidgets.QTreeWidgetItem(root_item)
            child.setFlags(child.flags() | QtCore.Qt.ItemIsUserCheckable)
            child.setText(0,"Child-{}".format(i))
            child.setCheckState(0,QtCore.Qt.Unchecked)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QtWidgets.QVBoxLayout(central_widget)
        lay.addWidget(self.tree)
        lay.addStretch(1)

        self.tree.collapsed.connect(self.handle_collapsed)
        self.tree.expanded.connect(self.handle_expanded)

    def handle_collapsed(self,index):
        h = self.tree.rowHeight(index) + self.tree.header().height() + 1
        self.adjust_height(h)

    def handle_expanded(self):
        h = self.tree.sizeHint().height()
        self.adjust_height(h)

    def adjust_height(self,height):
        self.tree.setFixedHeight(height)

    def showEvent(self,event):
        index = self.tree.indexFromItem(self.tree.topLevelItem(0))
        if self.tree.isExpanded(index):
            QtCore.QTimer.singleShot(0,self.handle_expanded)
        else:
            QtCore.QTimer.singleShot(
                0,lambda index=index: self.handle_collapsed(index)
            )
        super().showEvent(event)


app = QtWidgets.QApplication([])

w = MainWindow()
w.show()

app.exec_()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...