将标签从 QTabWidget 调整为内容

如何解决将标签从 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_())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?