问题描述
我有一个应用程序,其中包含一些子小部件的 QWidget 或带有 QSizePolicy.Minimum
的 QFrame 会根据所选选项更改其大小。带有 QSizePolicy.Expanding
的第二个小部件占用第一个小部件不需要的区域。所有小部件都包含在 QApplication 窗口中。这适用于 QWidget 或 QFrame 作为“容器”小部件。
当用 QTabWidget 替换容器小部件时,即使经过几天的试验,我也没有设法获得 QSizePolicy.Minimum
。在附加的 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_())
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)