仿折叠控件效果

This commit is contained in:
Irony 2019-05-27 17:53:43 +08:00
parent 676b0a4139
commit 3f2dcd7ad1
5 changed files with 103 additions and 1 deletions

View file

@ -30,6 +30,7 @@ encoding//QGraphicsDropShadowEffect/ShadowEffect.py=utf-8
encoding//QGraphicsView/WorldMap.py=utf-8
encoding//QListView/CustomWidgetSortItem.py=utf-8
encoding//QListView/SortItemByRole.py=utf-8
encoding//QListWidget/FoldWidget.py=utf-8
encoding//QMessageBox/CustomColorIcon.py=utf-8
encoding//QProgressBar/Lib/WaterRippleProgressBar.py=utf-8
encoding//QProgressBar/MetroCircleProgress.py=utf-8

89
QListWidget/FoldWidget.py Normal file
View file

@ -0,0 +1,89 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2019年5月27日
@author: Irony
@site: https://pyqt5.com https://github.com/PyQt5
@email: 892768447@qq.com
@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_())

View file

@ -4,6 +4,7 @@
- [删除自定义Item](#1删除自定义Item)
- [自定义可拖拽Item](#2自定义可拖拽Item)
- [腾讯视频热播列表](#3腾讯视频热播列表)
- [仿折叠控件效果](#4仿折叠控件效果)
## 1、删除自定义Item
[运行 DeleteCustomItem.py](DeleteCustomItem.py)
@ -41,4 +42,14 @@
2. `setWrapping(True)`
3. `setResizeMode(QListWidget.Adjust)`
![HotPlaylist](ScreenShot/HotPlaylist.gif)
![HotPlaylist](ScreenShot/HotPlaylist.gif)
## 4、仿折叠控件效果
[运行 FoldWidget.py](FoldWidget.py)
1. 利用`QListWidget`设置Item的自定义控件
2. `QListWidget`通过间隔设置`QPushButton`和`CustomWidget`来添加
3. 绑定按钮的选中状态通过`setHidden`设置Item的隐藏和显示
4. 自定义控件中尺寸发生变化后需要调用`adjustSize()`来同步
![FoldWidget](ScreenShot/FoldWidget.gif)

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

View file

@ -54,6 +54,7 @@ https://pyqt5.com 社区是专门针对PyQt5学习和提升开设的博客网站
- [删除自定义Item](QListWidget/DeleteCustomItem.py)
- [自定义可拖拽Item](QListWidget/DragDrop.py)
- [腾讯视频热播列表](QListWidget/HotPlaylist.py)
- [仿折叠控件效果](QListWidget/FoldWidget.py)
- [在item中添加图标](Test/partner_625781186/13.combo_listwidget)
- [QTreeWidget](QTreeWidget)
- [通过json数据生成树形结构](QTreeWidget/ParsingJson.py)