2016-02-22 2 views
1

Мне нужно настроить QTabWidget так, чтобы одна из ее полос вкладок (скажем, что есть 4 вкладки в целом) имеет свойство расширения и заполняет оставшееся пространство между другими вкладками. Есть идеи?Как сделать одну панель вкладок в QTabWidget расходной?

+0

Вы хотите язычки посмотреть, как это? '/ ---- \/------------------- \/---- \' –

+0

|/'' '' '' 'TAB1' '' ' '' '\ /' '' '' '' TAB2 '' '' '' '\ /' '' '' '' '' '' '' '' '' '' '' '' tAB3 '' '' '' '' '' '' '' '' '' '' '' '\ /' '' '' '' tab4 '' '' '' '\ | Более или менее что-то вроде этого;) И ширина этой третьей вкладки неизвестна, она должна полностью расширяться и переместить эту последнюю вкладку вправо. – Devlige

ответ

1

вы можете создать подкласс QTabBar, установите его на ширину вашего TabWidget (высота зависит от FontSize) и перезаписать tabSizeHint():

class tabBar(QTabBar): 

    def __init__(self, width, height, parent=None): 
     QTabBar.__init__(self, parent) 
     self.setFixedSize(width, height) 

    def tabSizeHint(self, i): 
     f = 3       # Tab3 shall be f times wider then the other tabs 
     tw = int(self.width()/(self.count() + f -1))  # width per Tab 
     if i == 2:      # Tab3      
      # return QSize(tw*f, self.height())   edited -> rounding error possible 
      return QSize(self.width() - (self.count() - 1)*tw, self.height()) 
     return QSize(tw, self.height())    # all other tabs 

и установить эту TabBar вашего TabWidget:

tb = tabBar(tabWidget.width(), 34)     # tabBars height depends on fontSize 
tabwidget..setTabBar(tb) 

выглядит следующим образом:

tabwidget with expanded tab

редактировать:

если TabWidget изменяется, resizeEvent() происходит. В этот момент TabWidget уже имеет свой новый размер и перекрасить IMMEDIATEDLY после resizeEvent(), see QT-Doc QTabWidget.resizeEvent

Так что, если width() из TabBar адаптировано в resizeEvent(), то TabBar всегда будет иметь такую ​​же ширину, как и TabWidget. Поскольку размер tabSizeHint() зависит от ширины, все вкладки также будут иметь правильную ширину. Таким образом, вы можете создать подкласс QTabWidget() и перезаписать resizeEvent() для динамического решения:

class tabWidget(QTabWidget): 

    def __init__(self, parent=None): 
     QTabWidget.__init__(self, parent) 

    def resizeEvent(self, event): 
     self.tabBar().setFixedWidth(self.width()) 
     QTabWidget.resizeEvent(self, event) 
+0

Ну, это сработало, но это не динамическое решение. Я имею в виду, что все это сокрушает, насколько я начинаю изменять размер главного окна/Все еще ценю ваше решение! – Devlige

1

Чтобы сделать это правильно, необходимо работать в обратном направлении от существующих размеров вкладок. Это связано с тем, что размер вкладок зависит от текущего стиля и от других функций, таких как кнопки закрытия вкладок. Также важно установить минимальный размер для вкладки, которая является расширяемой (в противном случае ее можно было бы изменить до нуля).

Вот простая демонстрация, которая делает все, что:

from PyQt4 import QtCore, QtGui 

class TabBar(QtGui.QTabBar): 
    def __init__(self, expanded=-1, parent=None): 
     super(TabBar, self).__init__(parent) 
     self._expanded = expanded 

    def tabSizeHint(self, index): 
     size = super(TabBar, self).tabSizeHint(index) 
     if index == self._expanded: 
      offset = self.width() 
      for index in range(self.count()): 
       offset -= super(TabBar, self).tabSizeHint(index).width() 
      size.setWidth(max(size.width(), size.width() + offset)) 
     return size 

class TabWidget(QtGui.QTabWidget): 
    def __init__(self, expanded=-1, parent=None): 
     super(TabWidget, self).__init__(parent) 
     self.setTabBar(TabBar(expanded, self)) 

    def resizeEvent(self, event): 
     self.tabBar().setMinimumWidth(self.width()) 
     super(TabWidget, self).resizeEvent(event) 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.tabs = TabWidget(2, self) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.tabs) 
     for text in 'One Two Three Four'.split(): 
      self.tabs.addTab(QtGui.QWidget(self), text) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 300, 400, 200) 
    window.show() 
    sys.exit(app.exec_()) 
Смежные вопросы