将标签从 QTabWidget 调整为内容

问题描述

我使用 QTabWidget 来显示不同大小的内容。如何以与我的内容相匹配的方式调整标签的大小?

目标:

表 1:

Tab1

标签 2:

Tab2

我试图编写一个连接到 QTabWidget.currentChanged() 的函数,我设法忽略了 QSizePolicy,但调整大小没有生效。但是,我可以毫无问题地手动调整大小。

master

解决方法

QTabWidget 与 QStackedWidget 一样,使用 QStackedLayout,它总是使用其所有小部件的最小尺寸提示计算出最小尺寸提示。

为了防止这种情况发生,应该重新实现 sizeHint()minimumSizeHint(),并且应该在索引更改时调用 updateGeometry()

在下面的例子中,我统一了从 QTabWidget 的 :sizeHint() 转换而来的两个函数,但是为了提供正确的实现,原始的 :minimumSizeHint() 实现也应该被改编。

class TabWidget(QTabWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.currentChanged.connect(self.updateGeometry)

    def minimumSizeHint(self):
        return self.sizeHint()

    def sizeHint(self):
        lc = QSize(0,0)
        rc = QSize(0,0)
        opt = QStyleOptionTabWidgetFrame()
        self.initStyleOption(opt)
        if self.cornerWidget(Qt.TopLeftCorner):
            lc = self.cornerWidget(Qt.TopLeftCorner).sizeHint()
        if self.cornerWidget(Qt.TopRightCorner):
            rc = self.cornerWidget(Qt.TopRightCorner).sizeHint()
        layout = self.findChild(QStackedLayout)
        layoutHint = layout.currentWidget().sizeHint()
        tabHint = self.tabBar().sizeHint()
        if self.tabPosition() in (self.North,self.South):
            size = QSize(
                max(layoutHint.width(),tabHint.width() + rc.width() + lc.width()),layoutHint.height() + max(rc.height(),max(lc.height(),tabHint.height()))
            )
        else:
            size = QSize(
                layoutHint.width() + max(rc.width(),max(lc.width(),tabHint.width())),max(layoutHint.height(),tabHint.height() + rc.height() + lc.height())
            )
        return size


class Window(QWidget):
    def __init__(self):
        # ...
        # no need to for a specific function,just directly call adjustSize()
        self.tabs.currentChanged.connect(self.adjustSize)

两个小建议。 1) 避免代码中不必要的行间距,因为它会分散注意力。 2) __init__ 最好放在类的开头,前面没有任何自定义函数:它是“初始化”,不应该放在其他东西之后。

,

我为我的代码管理了一个黑客修复:

import sys

from PyQt5.QtCore import (
    QSize
    )

from PyQt5.QtWidgets import (
    QApplication,QCheckBox,QTabWidget,QVBoxLayout,QHBoxLayout,QWidget,QLabel,QLineEdit,QSizePolicy,)

class Window(QWidget):
    
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Define Volumes")
        # Create a top-level layout
        layout = QVBoxLayout ()
        # Create the tab widget with two tabs
        self.tabs = QTabWidget()
        self.tabs.addTab(self.generalTabUI(),"Input")
        self.tabs.addTab(self.helpTabUI(),"Help")
        self.tabs.currentChanged.connect(self.curTabChanged)
        self.curTabChanged(0)
        layout.addWidget(self.tabs)
        self.setLayout(layout)
        self.rsz()

    def curTabChanged(self,index):
        for i in range(self.tabs.count()):
            self.tabs.widget(i).setSizePolicy(QSizePolicy.Ignored,QSizePolicy.Ignored)
        widget = self.tabs.currentWidget()
        widget.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred)
        const_width = self.tabs.widget(1).minimumSizeHint().width()
        widget.setFixedWidth(const_width)
        self.rsz()

    def rsz(self):
        for i in range(0,10):
            QApplication.processEvents()
        return self.resize(self.minimumSizeHint())

    def generalTabUI(self):
        """Create the General page UI."""
        generalTab = QWidget()
        layout = QHBoxLayout()
        self.label_text_left = QLabel("1-")
        self.label_text_right = QLabel("-100")
        self.textbox = QLineEdit()
        layout.addWidget(self.label_text_left)
        layout.addWidget(self.textbox)
        layout.addWidget(self.label_text_right)
        generalTab.setLayout(layout)
        return generalTab


    def helpTabUI(self):
        helpTab = QWidget()
        layout = QVBoxLayout()
        self.label = QLabel(self)
        self.label.setText("Lorem ipsum dolor sit amet,consectetur adipiscing elit,\n\nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. \n\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \n\nExcepteur sint occaecat cupidatat non proident,sunt in culpa qui officia deserunt mollit anim id est laborum.")
        layout.addWidget(self.label)
        helpTab.setLayout(layout)
        return helpTab


if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...