python - PyQt:无法使用 QTabWidget 实现 QSizePolicy.Minimum
问题描述
我有一个应用程序,其中QSizePolicy.Minimum
包含一些子小部件的 QWidget 或 QFrame 根据所选选项更改其大小。带有 的第二个小部件QSizePolicy.Expanding
占用第一个小部件不需要的区域。所有小部件都包含在 QApplication 窗口中。这适用于 QWidget 或 QFrame 作为“容器”小部件。
QSizePolicy.Minimum
当用 QTabWidget 替换容器小部件时,即使经过几天的试验,我也没有设法获得。在附加的 MWE 中,您可以在 QTabWidget 或 QFrame 中进行评论以测试差异。第二个扩展小部件由拉伸模拟。单击按钮可调整包含的子小部件的大小。我确定必须有一个简单的解决方案......
from PyQt5.QtWidgets import (
QTabWidget, QWidget, QFrame, QPushButton, QLabel, QVBoxLayout, QApplication,
QSizePolicy)
# ==============================================================================
class MyWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.lbl = QLabel("Hide me")
self.but = QPushButton("Hide text", self)
self.but.setCheckable(True)
lay_v_wdg = QVBoxLayout(self)
lay_v_wdg.addWidget(self.lbl)
lay_v_wdg.addWidget(self.but)
self.setLayout(lay_v_wdg)
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
self.but.clicked.connect(self.toggle_label)
# --------------------------------------------------------------------------
def toggle_label(self) -> None:
self.lbl.setVisible(self.but.isChecked())
# ==============================================================================
class MyFrame(QFrame):
def __init__(self, parent):
super(MyFrame, self).__init__(parent)
self.wdg = MyWidget(self)
lay_v_wdg = QVBoxLayout(self)
lay_v_wdg.addWidget(self.wdg)
self.setLayout(lay_v_wdg)
self.setFrameStyle(1)
# ==============================================================================
class MyTab(QTabWidget):
def __init__(self, parent):
super(MyTab, self).__init__(parent)
self.wdg = MyWidget(self)
self.tab = QTabWidget(self)
self.tab.setTabPosition(QTabWidget.West)
self.tab.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
self.tab.addTab(self.wdg, "A")
lay_v_tab = QVBoxLayout()
lay_v_tab.addWidget(self.tab)
self.setLayout(lay_v_tab)
# ==============================================================================
class TopWidget(QWidget):
def __init__(self, parent):
super(TopWidget, self).__init__(parent)
self.top = MyFrame(self) # <- select one of
# self.top = MyTab(self) # <- the two
lay_v_main = QVBoxLayout(self)
lay_v_main.addWidget(self.top)
lay_v_main.addStretch(10) # <- this compresses the other widget
self.setLayout(lay_v_main)
# ==============================================================================
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
mainw = TopWidget(None)
app.setActiveWindow(mainw)
mainw.show()
sys.exit(app.exec_())
解决方案
推荐阅读
- powershell - 使用 PowerShell 列出 OU 中所有计算机的信息
- sql - 选择相关表中第一行和最后一行的总和
- reactjs - 将 Create-React-App 部署到多个 URL
- firebase - Firebase 在 onCreate 期间获取用户数据
- python - 上传到 test.pypi.org 后 pip 包错误
- excel - 格式化带小数位的数字
- facebook - 这是什么?(Facebook Offline Conversions API) 错误 #21009 - 数据集上传暂时未准备好
- php - PHP:在 GAE 标准环境中启用 Ioncube 加载器扩展
- c++ - 创建一个带限制的数字数据类型,一个介于 -10 和 10 之间的 int
- c# - Asp DropDown List 的设置值不起作用