首页 > 解决方案 > 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_())

标签: pythonpyqtresizeqtabwidget

解决方案


推荐阅读