【问题标题】:Make every tab the same width and also expandable使每个选项卡的宽度相同且可扩展
【发布时间】:2018-02-10 22:12:56
【问题描述】:

我正在尝试实现类似于浏览器中的选项卡的功能。所有选项卡必须具有相同的宽度并且可以展开,因此当它们有很多时,它们需要调整大小并适合窗口(就像 Chrome 或 Firefox 一样)。


问题:

如果一个选项卡的文本比其他选项卡多,则该选项卡会更大。像这样:

如果我生成很多选项卡,它总是会比其他选项卡大。


我尝试过的:

我尝试添加样式表来更改宽度,但如果我将宽度更改为特定数字,则选项卡将是静态的,并且不会根据选项卡的数量调整大小以适应窗口。我还尝试调整最小/最大宽度,弄乱 QSizePolicy,但没有机会。

我查看了 QT5 for C++ 的文档并搜索了很多,但没有地方谈论这个或任何关于这个的选项。

也许我需要在 python 中进行一些计算并添加到样式表作为参数,但不确定如何。也许我缺少一个简单的选项。


我的代码:(这是完整的代码,如果需要,您可以复制粘贴并进行测试)

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTabWidget,\
    QVBoxLayout, QHBoxLayout, QSizePolicy


class Container(QWidget):
    def __init__(self, text):
        super(Container, self).__init__()

        self.hbox = QHBoxLayout()
        self.hbox.setSpacing(0)
        self.hbox.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.hbox)

        self.button = QPushButton(text)
        self.hbox.addWidget(self.button)


class CustomWidget (QWidget):
    def __init__(self, parent=None):
        super(CustomWidget, self).__init__(parent)

        self.button = QPushButton("Add tab")
        self.button.clicked.connect(self.buttonClicked)

        self.tabs = QTabWidget()
        self.tabs.setTabsClosable(True)
        self.tabs.setMovable(True)
        self.tabs.setDocumentMode(True)
        self.tabs.setElideMode(Qt.ElideRight)
        self.tabs.setUsesScrollButtons(True)
        self.tabs.tabCloseRequested.connect(self.closeTab)

        self.tabs.addTab(Container("Very big titleeeeeeeeee"),
                         "Very big titleeeeeeeeeeee")
        self.tabs.addTab(Container("smalltext"), "smalltext")
        self.tabs.addTab(Container("smalltext2"), "smalltext2")

        vbox = QVBoxLayout()
        vbox.addWidget(self.button)
        vbox.addWidget(self.tabs)
        self.setLayout(vbox)

        self.resize(600, 600)

    def closeTab(self, index):
        tab = self.tabs.widget(index)
        tab.deleteLater()
        self.tabs.removeTab(index)

    def buttonClicked(self):
        self.tabs.addTab(Container("smalltext2"), "smalltext2")


app = QApplication([])

app.setStyleSheet("""
    QTabBar::tab {
        background: lightgray;
        color: black;
        border: 0;
        /* min-width: 100px; */
        max-width: 200px;
        /* width: 150px; */
        height: 20px;
        padding: 5px;
    }

    QTabBar::tab:selected {
        background: gray;
        color: white;
    }
""")

widget = CustomWidget()
widget.show()

sys.exit(app.exec_())

其他信息:

操作系统:Windows 10
Python 版本:3.6.2
PyQt 版本:5.9.1

【问题讨论】:

    标签: python pyqt pyqt5 qtabwidget qtabbar


    【解决方案1】:

    要设置所有选项卡的宽度,我们必须重写 tabSizeHint() 方法,在这种情况下,我们会为所有选项卡返回相同的宽度。

    class TabBar(QTabBar):
        def tabSizeHint(self, index):
            size = QTabBar.tabSizeHint(self, index)
            w = int(self.width()/self.count())
            return QSize(w, size.height())
    

    分配这个自定义tabBar后,我们使用QTabWidgetsetTabBar()方法。

    self.tabs = QTabWidget()
    self.tabs.setTabBar(TabBar())
    

    输出:

    例子可以在以下link找到

    【讨论】:

    • 这正是我想要的!我在文档中看到了tabSizeHint,但我不知道如何使用,现在我知道了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多