2015-05-05 27 views
3

我有一个应用程序,我希望QTabBar与QTabWidget区域分开放置在一个单独的VBoxLayout中。它使用下面的代码的作品,但我有造型问题。在我将QTabBar从QTabWidget中分离出来之前,我没有遇到任何问题,但现在我无法弄清楚如何以我想要的方式来设计它。在QLayout中从QTabBar中删除填充/余量

#!/usr/bin/env python2 

from PyQt4 import QtGui, QtCore 
from peaks import * 

class mainWindow(QtGui.QWidget): 

    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.setWindowFlags(QtCore.Qt.Dialog) 

     self.tabWidget = QtGui.QTabWidget() 
     self.tabBar = QtGui.QTabBar() 
     self.tabBar.setContentsMargins(0,0,0,0) 
     self.tabWidget.setTabBar(self.tabBar) 
     self.tabWidget.setTabPosition(QtGui.QTabWidget.West) 
     self.tabWidget.setIconSize(QtCore.QSize(35, 35)) 

     self.tab1 = QtGui.QWidget() 
     self.tab2 = QtGui.QWidget() 

     tabLayoutBox = QtGui.QVBoxLayout() 
     tabLayoutBox.setContentsMargins(0,0,0,0) 
     tabLayoutBox.addWidget(self.tabBar) 

     mainHBox = QtGui.QHBoxLayout() 
     mainHBox.setContentsMargins(0,0,0,0) 
     mainHBox.setSpacing(0) 
     mainHBox.setMargin(0) 
     mainHBox.addLayout(tabLayoutBox) 
     mainHBox.addWidget(self.tabWidget) 

     mainVBox = QtGui.QVBoxLayout() 
     mainVBox.addWidget(QtGui.QWidget()) 
     mainVBox.addLayout(mainHBox) 
     self.setLayout(mainVBox) 


     self.tabWidget.addTab(self.tab1, 'tab1') 
     self.tabWidget.addTab(self.tab2, 'tab2') 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    app.setStyleSheet(
      "QTabBar { alignment: right; }" 
      "QTabBar::tear { width:0; border: none; }" 
      "QTabBar::scroller { width:0; border: none; }" 
      ) 


    main = mainWindow() 
    main.show() 
    sys.exit(app.exec_()) 

然而,有几件事情,我想,我不能弄清楚如何做到:

  • 我想消除QTabWidget和QTabBar之间的差距。我一直在尝试像setContentsMargins(0,0,0,0)这样的各种东西,并设置样式表,但我没有试过任何工作。

  • 我想让QTabBar与QTabWidget的顶部齐平。有趣的是,每当窗口调整大小时,选项卡似乎都会快速地在顶部切换。

的东西,我已经看了:

更新:我可以通过设置QTabBar miminumSizeHint模仿我的期望行为()到(15,15)和设置QTabBar::tab { margin-right: -15px; },但这不让我实际点击标签。由于某种原因,标签下方(即右侧)存在空间,我不知道如何摆脱它。

第二次更新:我已经确定了我认为的主要问题。我的代码使用

 self.tabWidget.setTabPosition(QtGui.QTabWidget.West) 

移动的标签左侧,但QTabWidget假定有一个的TabBar在那里,因此额外的空间。如果我做

 self.tabWidget.setTabPosition(QtGui.QTabWidget.East) 

空白显示在右边。这么一件事我能做的就是直接设置tabShape上的TabBar:

self.tabBar.setShape(QtGui.QTabBar.RoundedWest) 

然而,这留下了空白,在其中QTabWidget预计QTabBar是顶部。我可以在setShape之前使用setTabPosition将该空间向右移动,但这并不能解决实际摆脱它的问题。

回答

1

我无法弄清楚如何隐藏空白区域,所以我只是使用了一个很容易实现的QTabBar + QStackedWidget。为了使一个像QTabWidget所有你需要做的是连接QTabBar.currentChangedQStackedWidget.setCurrentIndex

self.stacked = QtGui.QStackedWidget() 
    self.tabBar = QtGui.QTabBar() 
    self.tabBar.currentChanged.connect(self.stacked.setCurrentIndex) 
    self.tabBar.setShape(QtGui.QTabBar.RoundedWest) 
    self.tabBar.updateGeometry() 
    self.tabBar.setContentsMargins(0,0,0,0) 

我也写了一个模拟QTabWidget.addTab一个方便的功能:

def addTab(self, widget, name): 
    self.stacked.addWidget(widget) 
    self.tabBar.addTab(name) 
+0

这是在没有得到任何其他答案后我接受的答案,但我不能选择它作为我的答案另外16个小时,它说。我也可以删除这个问题,因为这只是我自言自语,但我认为其他人也可以从中得到一些东西。 – erp

+0

您可以编辑这个来详细说明解决方法。 – Flexo

+0

这可能是最灵活的方法,当然这是问题的有效答案。它确实需要更多的解释,尽管(或者只是一些简单的示例代码)。 – ekhumoro

0

你的问题是,你重写通过将标签栏添加到布局来定位标签栏。

使用线条时,选项卡栏不再位于选项卡窗口小部件中。

tabLayoutBox = QtGui.QVboxLayout() 
tabLayoutBox.addWidget(self.tabBar) 

这些行重新标记标签栏。看起来你只是想使用setTabPosition()而不是创建自己的标签栏。除非您创建自定义选项卡栏类并且想要使用该选项卡,否则不需要设置新的选项卡栏。

我不知道为什么你会希望它在一个单独的布局,但另一种选择是使用

tabLayoutBox.setSpacing(0) 

这是间小部件将它们分开的间距。这个间距是用于小部件的。您在布局中有布局,因此setSpacing(0)可能不适用于布局上的间距。如果没有,你可能需要子类QVBoxLayout并创建你自己的布局。

编辑

我发现insertSpacing工作好了很多。

mainHBox.insertSpacing(1, -25) 
+0

这只是推进tabbar进一步向左,并切断了他们的顶部对我来说。我希望将这些标签分开放置,以便我可以利用它们下方的空间来在那里放一个滚动条。 – erp