如何解决PyQt:无法使用 QTabWidget 实现 QSizePolicy.Minimum
我有一个应用程序,其中包含一些子小部件的 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 举报,一经查实,本站将立刻删除。