如何通过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
相关产品推荐
相关产品推荐

