折叠区域

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <style type="text/css">
        *{
            padding: 0%;
            margin: 0%;
        }

        body{
            background: white;
            color: white;
            margin: 50px;
            font-family: "Helvetica Neue";
        }

        #collapse{
            width: 450px;
        }

        #collapse article{
            width: 450px;
            background:#8B59B6;
            border-bottom:1px solid rgba(255,255,255,.3);
        }

        #collapse h1{
            background:#8E44AD;
            height: 70px;
            line-height: 70px;
            font-size: 24px;
            text-indent: 30px;

            cursor: pointer;
            position: relative;
            transition: all 1s;
        }

        #collapse h1:hover{
            background:#6e208e;
        }

        #collapse h1::after{
            content: '';
            position: absolute;
            height: 0%;
            width: 0%;
            border-style: solid;
            border-width: 8px;
            border-color: #fff transparent transparent transparent;

            top: 40%;
            right: 10%;
        }

        /*下拉列表不展开(隐藏)的时候三角形的位置不同*/
        #collapse h1.hide::after{
            border-color:  transparent  #fff transparent transparent;
            top: 40%;
            right: 10%;
        }

        #collapse p{
            margin:0;
	        padding:30px;
	        color:rgba(255,255,255,.85);
        }

        #collapse p.hide{
            display: none;
        }
    </style>
</head>
<body>
    <section id="collapse">
        <article>
        <h1>Duis quistor</h1>
        <p>In hendrerit orci est, in lacinia diam suscipit a. Phasellus pulvinar lectus augue, vitae semper tortor ornare sit amet. Aliquam porttitor posuere turpis at volutpat. Aliquam non tellus cursus, interdum tortor non, scelerisque mi. Maecenas id nisi imperdiet, pellentesque dui congue, sollicitudin erat. Quisque finibus, sapien ut dapibus imperdiet, mauris ex feugiat sem, vel tempor ligula tellus quis mi.</p>
        </article>
        <article>
        <h1>Aenean libero</h1>
        <p>Ut auctor tincidunt sapien, eget pulvinar est tincidunt eu. Vivamus nisl quam, porta at nisi eget, laoreet tincidunt dui. Cras ac tortor a elit pretium hendrerit in non justo. Nullam vestibulum, lorem in lacinia facilisis, sem mauris tempus nisi, eget dignissim elit dui et quam. Curabitur imperdiet lectus orci, eget mollis velit euismod id.</p>
        </article>
        <article>
        <h1>Vestibulum</h1>
        <p>Duis in lobortis odio, nec tincidunt sem. Cras nibh lorem, sodales a mattis eu, dignissim placerat lacus. Nullam neque dui, euismod vitae egestas sed, feugiat quis tellus. Duis aliquet velit eget ligula lobortis, a maximus orci imperdiet. Pellentesque dictum eleifend lobortis. Sed dignissim viverra arcu, id tristique nunc. Integer sit amet dapibus nisl.</p>
        </article>
        </section>

        <script type="text/javascript">
            var title = document.getElementsByTagName("h1");
            var article = document.getElementsByTagName("article");

            /*因为不确定有几个title+article,对其进行初始化和点击变化时通过数组的遍历进行改变*/
            foldAll();//初始状态为折叠状态
            function foldAll(){
                for(var i = 0; i < title.length;i++){
                    title[i].className = "hide";
                    article[i].getElementsByTagName("p")[0].className = "hide";
                }
            }

            for(var i = 0; i < title.length; i++){
                title[i].onclick = function(e){
                    refreshCollapse(this); //传递是当前对对象,不是event
                }
            }
            /*对每一个article,从初始状态点击一下先是展开,在点击一下折叠
                若点击了其他的article,则当前article还是要折叠的,所以应该先判断当前的状态
                若是折叠的,在foldAll之后targetClass状态,反之亦然
            */
            function refreshCollapse(obj){
                var targetClass;
                if(obj.className == 'hide'){
                    targetClass = "";
                }else{
                    targetClass = "hide";
                }

                //先折叠所有区域
                foldAll();
                obj.className = targetClass;
                //obj.parentNode记为article[i]
                obj.parentNode.getElementsByTagName("p")[0].className = targetClass;
            }
            
        </script>
</body>
</html>

### 创建可折叠区域 为了在 PyQt5 中创建可折叠区域,通常会自定义一个 `QWidget` 类并重写其行为以支持展开和收起功能。这可以通过设置布局中的可见性和调整大小来实现。 以下是创建可折叠区域的一个简单示例: ```python import sys from PyQt5.QtCore import Qt, QRect from PyQt5.QtWidgets import (QWidget, QPushButton, QVBoxLayout, QApplication, QLabel) class CollapsibleBox(QWidget): def __init__(self, title="", parent=None): super(CollapsibleBox, self).__init__(parent) self.toggle_button = QPushButton( f"{title}", checked=False, checkable=True, clicked=self.on_pressed ) self.toggle_animation = QtCore.QParallelAnimationGroup(self) self.content_area = QWidget( maximumHeight=0, minimumHeight=0 ) lay = QVBoxLayout() lay.setSpacing(0) lay.setContentsMargins(0, 0, 0, 0) lay.addWidget(self.toggle_button) lay.addWidget(self.content_area) self.setLayout(lay) self.setContentLayout(QVBoxLayout()) def setContentLayout(self, content_layout): lay = self.layout() anim = QtCore.QPropertyAnimation(self, b"minimumHeight") anim.setDuration(200) lay.removeWidget(self.content_area) self.content_area.destroy() self.content_area = QWidget() self.content_area.setLayout(content_layout) lay.insertWidget(1, self.content_area) collapsed_height = ( self.sizeHint().height() - self.content_area.maximumHeight() ) content_height = content_layout.sizeHint().height() for i in range(self.toggle_animation.count()): self.toggle_animation.animationAt(i).stop() self.toggle_animation.clear() anim = QtCore.QPropertyAnimation(self, b"minimumHeight") anim.setDuration(200) anim.setStartValue(collapsed_height) anim.setEndValue(collapsed_height + content_height) self.toggle_animation.addAnimation(anim) self.setMaximumHeight(collapsed_height) def on_pressed(self): checked = self.toggle_button.isChecked() self.toggle_animation.setDirection( QtCore.QAbstractAnimation.Forward if not checked else QtCore.QAbstractAnimation.Backward ) self.toggle_animation.start() if __name__ == "__main__": app = QApplication(sys.argv) widget = QWidget() main_layout = QVBoxLayout() collapsible_box = CollapsibleBox("测试标题") layout_content = QVBoxLayout() layout_content.addWidget(QLabel("这是内部的内容")) layout_content.addWidget(QLabel("更多内容...")) collapsible_box.setContentLayout(layout_content) main_layout.addWidget(collapsible_box) widget.setLayout(main_layout) widget.show() sys.exit(app.exec_()) ``` 上述代码展示了如何创建一个带有标题按钮的可折叠部件[^1]。当点击标题按钮时,该部分会展开或收缩,从而隐藏或显示其中的内容。这种技术非常适合用来组织复杂界面上的信息层次结构,提高用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值