You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过QSplitter实现子元素逐个隐藏(附PyQt6实现方案)

问题与实现方案

问题描述

我使用QSplitter将主窗口分为上下两部分,上部为QTabWidget,下部是包含多个子元素的QVBoxLayout。当前拖动QSplitter时会一次性隐藏整个QVBoxLayout,但我希望实现拖动过程中逐个隐藏其中的子元素:先显示Button1、TextLabel、Button2,接着隐藏Button2显示前两个,最后仅保留Button1。请问能否通过Qt Creator实现该功能?

PyQt6实现代码

main.py

from PyQt6 import QtWidgets, uic
import sys

class mw(QtWidgets.QMainWindow):
    def __init__(self, *args):
        super(mw, self).__init__(*args)
        uic.loadUi("mainwindow.ui", self)
        self.splitter.splitterMoved.connect(self.splitterMoved)

    def splitterMoved(self, pos: int, index: int):
        delta = self.splitter.height() - pos - self.splitter.handleWidth()
        items = [self.pb1, self.label, self.pb2] # 第一个是最后消失的元素
        used = items[0].height()
        for f in items[1:]:
            used += f.height() + self.innerLay.spacing()
            f.setVisible(used <= delta) # 用<代替<=可以提前隐藏元素

app = QtWidgets.QApplication(sys.argv)
mw = mw()
mw.show()
app.exec()

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout_2">
    <item>
     <widget class="QSplitter" name="splitter">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
      </property>
      <property name="handleWidth">
       <number>5</number>
      </property>
      <widget class="QTableView" name="tableView"/>
      <widget class="QWidget" name="verticalLayoutWidget">
       <layout class="QVBoxLayout" name="innerLay">
        <property name="spacing">
         <number>6</number>
        </property>
        <item>
         <spacer name="verticalSpacer">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>20</width>
            <height>40</height>
           </size>
          </property>
         </spacer>
        </item>
        <item>
         <widget class="QPushButton" name="pb1">
          <property name="text">
           <string>PushButton1</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QLabel" name="label">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
            <horstretch>0</horstretch>
            <verstretch>0</verstretch>
           </sizepolicy>
          </property>
          <property name="text">
           <string>TextLabel</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QPushButton" name="pb2">
          <property name="text">
           <string>PushButton2</string>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

内容的提问来源于stack exchange,提问作者brazoayeye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:36:02