【问题标题】:PyQT5 QTabbar Expand tab headerPyQT5 QTabbar 展开选项卡标题
【发布时间】:2021-01-17 04:40:58
【问题描述】:

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

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_())

【问题讨论】:

  • QTabBar 参见setExpanding()(您可以在标签小部件上使用tabBar() 获得。
  • 这个我试过了,self.tabs.tabBar().setExpanding(True),还是不行

标签: python pyqt pyqt5


【解决方案1】:

标签的大小是使用当前 QStyle 给出的提示来计算的。

由于 QTabWidget 使用标签栏的 sizeHint 来设置标签栏的大小,而 sizeHint 通常基于tabSizeHint(),所以你必须重新实现两者:

  • 需要 sizeHint() 以提供与父级相同的宽度(或高度);
  • tabSizeHint() 考虑到 sizeHint() 的基本实现,以根据选项卡的内容计算提示,如果它小于当前大小,则建议基于可用空间除以选项卡计数的大小;
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))

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

【讨论】:

    【解决方案2】:

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

    它不是规范的,但它可以完成工作。

    import sys
    from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QTabWidget, QVBoxLayout
    
    
    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()
            self.tabs.tabBar().setExpanding(True)
            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)
    
        def resizeEvent(self, event):
            super().resizeEvent(event)
            self._set_tabs_width()
    
        def showEvent(self, event):
            super().showEvent(event)
            self._set_tabs_width()
    
        def _set_tabs_width(self):
            tabs_count = self.tabs.count()
            tabs_width = self.tabs.width()
            tab_width = tabs_width / tabs_count
            css = "QTabBar::tab {width: %spx;}" % tab_width
            self.tabs.setStyleSheet(css)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = App()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2020-10-27
      • 2021-09-19
      • 2021-01-28
      • 2013-09-10
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多