PyQt5 - QTabWidget - 使每个标签的宽度相同,也可扩展

PyQt5 - QTabWidget - 使每个标签的宽度相同,也可扩展

问题描述:

我试图实现类似浏览器中的选项卡。所有选项卡必须具有相同的宽度,并且可以扩展,因此当有很多选项卡需要调整大小并适合窗口时(与Chrome或Firefox完全相同)。PyQt5 - QTabWidget - 使每个标签的宽度相同,也可扩展


问题:

如果一个标签有更多的文本,然后其他标签,标签会较大。像这样:

enter image description here

如果我催生了很多标签,它总是会更大然后其他人。

enter image description here


我曾尝试:

我已尝试添加样式表来改变宽度,但如果我改变宽度的具体数量,标签会静态,而不是基于选项卡的数量来适应窗口的大小。此外,我试图调整最小/最大宽度,与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

要设置宽度,我们必须覆盖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()) 

输出:

enter image description here

的例子可以在以下link

+0

发现这正是我想要的!我在文档中看到了'tabSizeHint',但我不知道如何使用,现在我知道了。谢谢! –