2017-09-01 5 views
1

Ich versuche, etwas wie die Registerkarten aus einem Browser zu erreichen. Alle Registerkarten müssen die gleiche Breite haben und auch erweiterbar sein. Wenn sie zahlreich sind, müssen sie angepasst und angepasst werden (genau wie Chrome oder Firefox).PyQt5 - QTabWidget - Machen Sie jede Registerkarte die gleiche Breite und auch erweiterbar


Das Problem:

Wenn ein Reiter mehr Text hat dann die anderen Registerkarten, wird der Registerkarte größer sein. Wie so:

enter image description here

Und wenn ich viele Tabs laichen, es wird immer größer sein, dann die anderen.

enter image description here


Was habe ich versucht:

Ich habe versucht, ein Stylesheet hinzuzufügen, um die Breite zu ändern, aber wenn ich die Breite auf eine bestimmte Nummer zu ändern, werden die Registerkarten sein statisch und nicht die Größe basierend auf der Anzahl der Registerkarten, um das Fenster anzupassen. Ich habe auch versucht, mit Min/Max-Breite zu zwicken, mit der QSizePolicy, aber keine Chance.

Ich habe die Dokumentation von QT5 für C++ angeschaut und viel gegoogelt, aber kein Ort spricht über diese oder irgendeine Option darüber.

Vielleicht muss ich einige Berechnungen in Python und ein Stylesheet als Argument hinzufügen, aber nicht sicher, wie. Vielleicht gibt es eine einfache Option, die ich vermisse.


Mein Code: (Dies ist der vollständige Code, so können Sie copy-paste und testen, wenn Sie benötigen)

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

Weitere Informationen:

Betriebssystem: Windows 10
Python Version: 3.6.2
PyQt Version: 5.9.1

Antwort

1

Um die Breite für alle Registerkarten setzen wir die tabSizeHint() Methode, in diesem Fall außer Kraft setzen müssen wir die gleiche Breite für alle Register zurück.

class TabBar(QTabBar): 
    def tabSizeHint(self, index): 
     size = QTabBar.tabSizeHint(self, index) 
     w = int(self.width()/self.count()) 
     return QSize(w, size.height()) 

Nach der Zuweisung dieses benutzerdefinierten tabBar verwenden wir die setTabBar() Methode von QTabWidget.

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

Ausgang:

enter image description here

Das Beispiel lässt sich in der folgenden link

+0

Das ist genau das finden, was ich wollte!Ich habe 'tabSizeHint' in der Dokumentation gesehen, aber ich wusste nicht genau, wie ich es benutzen soll, jetzt weiß ich es. Vielen Dank! –

Verwandte Themen