Python PyQT5 QTabar展开选项卡标题

Python PyQT5 QTabar展开选项卡标题,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我正在编写一个只有两个选项卡的QTabwidget。但是选项卡标题(名称)不适合QTabwidget宽度。我想适应选项卡栏的长度(两个选项卡标题) 受此启发,我认为您可以覆盖showEvent(甚至resizeEvent)来计算新的宽度并通过样式表进行设置 它不是规范的,但它确实起到了作用 导入系统 从PyQt5.qtwidts导入QMainWindow、QApplication、QWidget、QTabWidget、QVBoxLayout 类应用程序(QMainWindow): 定义初始化(自

我正在编写一个只有两个选项卡的QTabwidget。但是选项卡标题(名称)不适合QTabwidget宽度。我想适应选项卡栏的长度(两个选项卡标题)

受此启发,我认为您可以覆盖
showEvent
(甚至
resizeEvent
)来计算新的宽度并通过样式表进行设置

它不是规范的,但它确实起到了作用

导入系统 从PyQt5.qtwidts导入QMainWindow、QApplication、QWidget、QTabWidget、QVBoxLayout 类应用程序(QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() self.table_widget=MyTableWidget(self) self.setCentralWidget(self.table_小部件) self.show() 类MyTableWidget(QWidget): 定义初始化(自身,父级): 超级(QWidget,self)。\uuuuu初始化\uuuuuuuuuu(父级) self.layout=QVBoxLayout(self) self.tabs=QTabWidget() self.tabs.tabBar().setExpansing(True) self.tab1=QWidget() self.tab2=QWidget() self.tabs.resize(300200) self.tabs.addTab(self.tab1,“tab1”) self.tabs.addTab(self.tab2,“tab2”) #创建第一个选项卡 self.tab1.layout=QVBoxLayout(self) self.layout.addWidget(self.tabs) self.setLayout(self.layout) def resizeEvent(自我,事件): super().resizeEvent(事件) self.\u set\u tabs\u width() def showEvent(自我、事件): super().showEvent(事件) self.\u set\u tabs\u width() 定义设置标签宽度(自): tabs\u count=self.tabs.count() tabs\u width=self.tabs.width() 制表符宽度=制表符宽度/制表符计数 css=“QTabBar::tab{width:%spx;}”%tab\u width self.tabs.setStyleSheet(css) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) ex=App() sys.exit(app.exec_())
选项卡的大小是使用当前QStyle给出的提示计算的

由于QTabWidget使用选项卡栏的sizeHint来设置选项卡栏大小,并且sizeHint通常基于,因此您必须重新实现这两个功能:

  • sizeHint()是必需的,以便提供与父级相同的宽度(或高度)
  • tabSizeHint()考虑sizeHint()的基本实现,根据选项卡的内容计算提示,如果小于当前大小,则建议使用可用空间除以选项卡计数的大小
类选项卡栏(qtwidts.qtabar):
def sizeHint(自身):
hint=super().sizeHint()
如果self.isVisible()和self.parent():
如果不是self.shape()&self.RoundedEast:
#水平的
hint.setWidth(self.parent().width())
其他:
#垂直的
hint.setHeight(self.parent().height())
返回提示
def tabSizeHint(自身,索引):
hint=super().tabSizeHint(索引)
如果不是self.shape()&self.RoundedEast:
averageSize=self.width()/self.count()
如果super().sizeHint().width()

请注意,这是一个非常基本的实现,在某些情况下,您可能会看到具有很长选项卡名称的滚动按钮,即使理论上应该有足够的空间来查看它们。

请参阅QTabar(您可以使用tab小部件上的
tabBar()
来获得它。我已经尝试过这个,self.tabs.tabBar().setExpansing(对),但没有起作用
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget,QVBoxLayout
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

class App(QMainWindow):

    def __init__(self):
        super().__init__()

        self.table_widget = MyTableWidget(self)
        self.setCentralWidget(self.table_widget)
        
        self.show()
    
class MyTableWidget(QWidget):
    
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)
        
        self.tabs = QTabWidget()
        """ Here I want to fit the two tab 
            headers withthe QTabwidget width
        """
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tabs.resize(300,200)
        
        self.tabs.addTab(self.tab1,"Tab 1")
        self.tabs.addTab(self.tab2,"Tab 2")
        
        # Create first tab
        self.tab1.layout = QVBoxLayout(self)
        
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
class TabBar(QtWidgets.QTabBar):
    def sizeHint(self):
        hint = super().sizeHint()
        if self.isVisible() and self.parent():
            if not self.shape() & self.RoundedEast:
                # horizontal
                hint.setWidth(self.parent().width())
            else:
                # vertical
                hint.setHeight(self.parent().height())
        return hint

    def tabSizeHint(self, index):
        hint = super().tabSizeHint(index)
        if not self.shape() & self.RoundedEast:
            averageSize = self.width() / self.count()
            if super().sizeHint().width() < self.width() and hint.width() < averageSize:
                hint.setWidth(averageSize)
        else:
            averageSize = self.height() / self.count()
            if super().sizeHint().height() < self.height() and hint.height() < averageSize:
                hint.setHeight(averageSize)
        return hint

# ...
        self.tabWidget = QtWidgets.QTabWidget()
        self.tabWidget.setTabBar(TabBar(self.tabWidget))