HOME/Articles/

pyqt example FoldWidget (snippet)

Article Outline

Python pyqt (gui) example 'FoldWidget'

FoldWidget

Python pyqt example: FoldWidget

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2019年5月27日
@author: Irony
@site: https://pyqt5.com https://github.com/PyQt5
@email: [email protected]
@file: FoldWidget
@description: 自定义item折叠控件仿QTreeWidget
"""

from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QWidget, QPushButton, QFormLayout,\
    QLineEdit, QListWidget, QListWidgetItem, QCheckBox


__Author__ = "Irony"
__Copyright__ = "Copyright (c) 2019"
__Version__ = "Version 1.0"


class CustomWidget(QWidget):

    def __init__(self, item, *args, **kwargs):
        super(CustomWidget, self).__init__(*args, **kwargs)
        self.oldSize = None
        self.item = item
        layout = QFormLayout(self)
        layout.addRow('我是label', QLineEdit(self))
        layout.addRow('点击', QCheckBox(
            '隐藏下面的按钮', self, toggled=self.hideChild))
        self.button = QPushButton('我是被隐藏的', self)
        layout.addRow(self.button)

    def hideChild(self, v):
        self.button.setVisible(not v)
        # 这里很重要 当隐藏内部子控件时 需要重新计算高度
        self.adjustSize()

    def resizeEvent(self, event):
        # 解决item的高度问题
        super(CustomWidget, self).resizeEvent(event)
        self.item.setSizeHint(QSize(self.minimumWidth(), self.height()))


class CustomButton(QPushButton):
    # 按钮作为开关

    def __init__(self, item, *args, **kwargs):
        super(CustomButton, self).__init__(*args, **kwargs)
        self.item = item
        self.setCheckable(True)  # 设置可选中

    def resizeEvent(self, event):
        # 解决item的高度问题
        super(CustomButton, self).resizeEvent(event)
        self.item.setSizeHint(QSize(self.minimumWidth(), self.height()))


class Window(QListWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)

        for _ in range(3):
            # 开关
            item = QListWidgetItem(self)
            btn = CustomButton(item, '折叠', self, objectName='testBtn')
            self.setItemWidget(item, btn)

            # 被折叠控件
            item = QListWidgetItem(self)
            # 通过按钮的选中来隐藏下面的item
            btn.toggled.connect(item.setHidden)
            self.setItemWidget(item, CustomWidget(item, self))


if __name__ == '__main__':
    import sys
    import cgitb
    sys.excepthook = cgitb.enable(1, None, 5, '')
    from PyQt5.QtWidgets import QApplication
    app = QApplication(sys.argv)
    # 通过qss改变按钮的高度
    app.setStyleSheet('#testBtn{min-height:40px;}')
    w = Window()
    w.show()
    sys.exit(app.exec_())