簡體   English   中英

PyQT5 QTabbar 展開選項卡 header

[英]PyQT5 QTabbar Expand tab header

我正在編寫一個只有兩個選項卡的 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_())

受此答案的啟發,我認為您可以覆蓋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_())

選項卡的大小是使用當前 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))

請注意,這是一個非常基本的實現,在某些情況下,您可能會看到帶有很長選項卡名稱的滾動按鈕,即使理論上應該有足夠的空間來查看它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM