2017-09-01 17 views
1

ブラウザからタブのようなものを実現しようとしています。すべてのタブの幅は同じで、エキスパンドでなければならないため、サイズが大きくてウィンドウのサイズやサイズを変更する必要があります(ChromeやFirefoxのように)。PyQt5 - QTabWidget - すべてのタブを同じ幅で拡張可能にする


問題:

タブは、他のタブを複数のテキストを持っている場合は、タブが大きくなります。これと同じように:私は、タブをたくさん生む場合

enter image description here

そして、それは常に他人その後、大きくなります。

を私は幅を変更するにはスタイルシートを追加しようとしましたが、私は特定の数に幅を変更した場合、タブは次のようになります。私が試してみました何

enter image description here


静的ではなく、ウィンドウのサイズに合わせてタブの数に基づいてサイズを変更しないでください。また、最小/最大幅で微調整しようとしましたが、QSizePolicyを混乱させましたが、チャンスはありませんでした。

私はQT5 for C++のドキュメントを見ていて、たくさんのGoogle検索を行っていますが、これやこれに関するオプションについては語っていません。

おそらく、私は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

答えて

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

は、このカスタムタブバーを割り当てた後、私たちはQTabWidgetsetTabBar()メソッドを使用します。

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

出力:

enter image description here

の例では、私が望んでいたまさにです以下link

+0

で見つけることができます!ドキュメントの 'tabSizeHint'を見ましたが、使用方法を正確には分からなかったので、今私は知っています。ありがとうございました! –

関連する問題